POJ 3660 Cow Contest floyd求传递闭包 || bfs
2017-08-16 10:50
393 查看
题目:
http://poj.org/problem?id=3660题意:
有n个奶牛在比赛,有m个比赛结果,形式如a,b代表a战胜了b,同时比赛关系是可以传递的,例如a战胜了b、b战胜了c,那么可以得到a战胜了c。问有多少只奶牛可以确定在这n只奶牛中的名次思路:
可以发现,对于一个奶牛而言,如果战胜它的奶牛数和它打败的奶牛数之和等于n−1,那么这只奶牛的名次是可以确定的,于是可以用floyd算法求传递闭包,所谓传递背包简单来说就是x−>y,y−>z可以得到x−>z,可以发现跟题目相符合,然后统计一下战胜一个奶牛的奶牛数和这个奶牛战胜的奶牛数,再判断一个即可。另外正向建图,对每一个奶牛进行一次bfs,求出这个奶牛打败的奶牛数,然后反向建图,再对每一个奶牛进行一次bfs,求出战胜这个奶牛的奶牛数,然后判断一下即可。floyd:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 100 + 10, INF = 0x3f3f3f3f; bool mp ; void floyd(int n) { for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) if(mp[i][k]) //一个优化 for(int j = 1; j <= n; j++) mp[i][j] = mp[i][j] || (mp[i][k] && mp[k][j]); } int main() { int n, m; while(~ scanf("%d%d", &n, &m)) { memset(mp, 0, sizeof mp); int a, b; for(int i = 1; i <= m; i++) { scanf("%d%d", &a, &b); mp[a][b] = 1; } floyd(n); int ans = 0; for(int i = 1; i <= n; i++) { int tot = 0; for(int j = 1; j <= n; j++) if(mp[i][j] || mp[j][i]) tot++; if(tot == n-1) ans++; } printf("%d\n", ans); } return 0; }
bfs:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 100 + 10, INF = 0x3f3f3f3f; struct edge { int to, next; }g[N*N*2]; int cnt, head ; int a[N*N*2], b[N*N*2]; bool vis ; void add_edge(int v, int u) { g[cnt].to = u, g[cnt].next = head[v], head[v] = cnt++; } int bfs(int s) { queue<int> que; memset(vis, 0, sizeof vis); que.push(s), vis[s] = true; int tot = 0; while(! que.empty()) { int v = que.front(); que.pop(); for(int i = head[v]; i != -1; i = g[i].next) { int u = g[i].to; if(! vis[u]) que.push(u), vis[u] = true, tot++; } } return tot; } int main() { int n, m; while(~ scanf("%d%d", &n, &m)) { cnt = 0; memset(head, -1, sizeof head); for(int i = 1; i <= m; i++) { scanf("%d%d", &a[i], &b[i]); add_edge(a[i], b[i]); } int t1 , t2 ; for(int i = 1; i <= n; i++) t1[i] = bfs(i); cnt = 0; memset(head, -1, sizeof head); for(int i = 1; i <= m; i++) add_edge(b[i], a[i]); for(int i = 1; i <= n; i++) t2[i] = bfs(i); int ans = 0; for(int i = 1; i <= n; i++) if(t1[i] + t2[i] == n-1) ans++; printf("%d\n", ans); } return 0; }
相关文章推荐
- Cow Contest POJ - 3660(Floyd,传递闭包)
- Cow Contest POJ - 3660 (floyd求传递闭包)
- Cow Contest POJ - 3660(传递闭包,floyd)
- POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)
- poj 3660 Cow Contest floyd 传递闭包!!基础
- POJ - 3660 Cow Contest floyd
- poj 3660 Cow Contest floyd
- 【POJ】3660 Cow Contest floyd(可以拓扑排序?)
- POJ-3660 Cow Contest Floyd传递闭包的应用
- poj Cow Contest(传递闭包)
- POJ 1975 Median Weight Bead floyd求传递闭包 || bfs
- poj Cow Contest(传递闭包)
- poj 3660 Cow Contest Flyod
- POJ - 3660 - Cow Contest (floyd求传递闭包)
- POJ 3660 牛的排名 (Floyd 传递闭包)
- poj Cow Contest(传递闭包)
- Cow Contest POJ - 3660
- poj 3660 Cow Contest Flyod
- POJ 3660 && NYIST 211 Cow Contest && ZOJ 1060 Sorting It All Out【Floyd算法扩展应用】
- Cow Contest(Poj 3660)