week7-A-Floyd-TT的魔法貓

題意:

衆所周知,TT 有一隻魔法貓。

這一天,TT 正在專心致志地玩《貓和老鼠》遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 TT 比賽的最終結果。TT 很是詫異,不只詫異於他的小貓咪竟然會說話,更詫異於這可愛的小不點爲什麼有如此魔力?

魔法貓告訴 TT,它其實擁有一張遊戲勝負表,上面有 N 我的以及 M 個勝負關係,每一個勝負關係爲 A B,表示 A 能賽過 B,且勝負關係具備傳遞性。即 A 賽過 B,B 賽過 C,則 A 也能賽過 C。

TT 不相信他的小貓咪什麼比賽都能預測,所以他想知道有多少對選手的勝負沒法預先得知,你能幫幫他嗎?

Inputios

第一行給出數據組數。

每組數據第一行給出 N 和 M(N , M <= 500)。

接下來 M 行,每行給出 A B,表示 A 能夠賽過 B。

Output算法

對於每一組數據,判斷有多少場比賽的勝負不能預先得知。注意 (a, b) 與 (b, a) 等價,即每個二元組只被計算一次。

Sample Inputspa

3
3 3
1 2
1 3
2 3
3 2
1 2
2 3
4 2
1 2
3 4

Sample Outputcode

0
0
4

My Solution:blog

這個問題能夠抽象成一個(有向)圖問題,利用Floyd算法思想,求出任意兩點之間的關係(是否單向可達),進而得出彼此不連通的點對的數目便可。遊戲

注意:雖然是有向圖,可是本題中對於具體的兩點之間的(是否有輸贏)關係,(a,b)等價於(b,a)ci

 

Code:string

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 int N,M;
 5 bool a[510][510];
 6 int main()
 7 {
 8     int nums,x,y,res=0;
 9     cin>>nums;
10     while(nums--)
11     {
12         cin>>N>>M;
13         res=0;
14         memset(a,0,sizeof(a));
15         for(int i=1;i<=M;i++)
16         {
17             cin>>x>>y;
18             a[x][y]=1;
19         }
//Floyd
20 for(int k=1;k<=N;k++) 21 for(int i=1;i<=N;i++) 22 if(a[i][k]) 23 for(int j=1;j<=N;j++) 24 if(a[k][j]) 25 { 26 a[i][j]=1; 27 } 28 for(int i=1;i<=N;i++) 29 for(int j=i+1;j<=N;j++) 30 if(!a[i][j]&&!a[j][i]) res++; 31 cout<<res<<endl; 32 33 } 34 }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息