日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 3660 Cow Contest 传递闭包

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 3660 Cow Contest 传递闭包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

  http://poj.org/problem?id=3660

題目大意:

  有n頭牛,每頭牛都有一個戰斗值,農夫約翰想給這些牛排名次,但是只有m場比賽,約翰想知道有多少頭牛的名次是確定的。

解題思路:

  是一個求傳遞閉包的題目,傳遞性就是如果i可以到達k,k可以到達j,那么i就可以到達j,求傳遞閉包就是把圖中所有滿足這樣的性質的節點全部求出來,我們可以知道任意兩點是否向通。可以用floyd實現傳遞閉包。

經過分析可知,如果牛a與其他的牛都有關系(無論什么關系),那么牛a的名次就是確定的。

1 #include <vector> 2 #include <queue> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 #define maxn 110 10 11 int map[maxn][maxn]; 12 int n; 13 14 void init (); 15 void floyd (); 16 17 int main () 18 { 19 int m; 20 while (scanf ("%d %d", &n, &m) != EOF) 21 { 22 init (); 23 while (m --) 24 { 25 int a, b; 26 scanf ("%d %d", &a, &b); 27 map[a][b] = 1; 28 } 29 floyd (); 30 for (int i=1; i<=n; i++)//統計與牛a有關的牛有幾個 31 for (int j=0; j<=n; j++) 32 if (map[i][j]) 33 map[0][i] ++, map[0][j] ++; 34 35 36 int sum = 0; 37 for (int i=1; i<=n; i++) 38 if (map[0][i] == n - 1) 39 sum ++; 40 printf ("%d\n", sum); 41 } 42 return 0; 43 } 44 45 void init () 46 { 47 int i, j; 48 for (i=0; i<maxn; i++) 49 for (j=0; j<maxn; j++) 50 map[i][j] = 0; 51 } 52 void floyd () 53 { 54 int i, j, k; 55 for (k=1; k<=n; k++) 56 for (i=1; i<=n; i++) 57 for (j=1; j<=n; j++) 58 if (map[i][k] && map[k][j])//傳遞性 59 map[i][j] = 1; 60 }

?

轉載于:https://www.cnblogs.com/alihenaixiao/p/4239983.html

總結

以上是生活随笔為你收集整理的poj 3660 Cow Contest 传递闭包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。