POJ 3660 (Floyd判断传递闭包)

题目:输入n头牛,m个关系。接下来m行每行两个int数a,b,代表a可以打败b

问:能确定多少头牛的排名

思路:floyd算法可以判断传递闭包问题(通过传递性推导出尽量多的元素之间的关系叫做传递闭包),模板题

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
//const int maxn = 1e5+5;
#define ll long long
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
//const int inf = 0x6fffffff;

#define MAX INT_MAX
#define FOR(i,a,b) for( int i = a;i <= b;++i)
#define bug cout<<"--------------"<<endl
using namespace std;
bool d[310][310];
int n,m,ans;
int main()
{
      ios::sync_with_stdio(false);
    cin>>n>>m;
    FOR(i,1,n) d[i][i] = 1;
    FOR(i,1,m)
    {
        int x,y,z;
        cin>>x>>y;
        d[x][y] = 1;
    }
    FOR(k,1,n)
    FOR(i,1,n)
    FOR(j,1,n)
    d[i][j] |= d[i][k] & d[k][j];
    for(int i=1 ; i<=n;++i)
    {
        int du = 0;
        for(int j=1;j<=n;++j)
        {
            if(i == j) continue;
            if(d[i][j] == 1 || d[j][i] == 1) du++;
        }
        if(du == n-1) ans++;
    }
    cout<<ans<<endl;
}

原文地址:https://www.cnblogs.com/jrfr/p/11370913.html

时间: 2024-10-31 11:10:31

POJ 3660 (Floyd判断传递闭包)的相关文章

Cow Contest POJ - 3660 floyd传递闭包

#include<iostream> #include<cstring> using namespace std; const int N=110,INF=0x3f3f3f3f; int f[N][N]; int main() { int n,m; cin>>n>>m; memset(f,0x3f,sizeof f); int x,y; for(int i=0;i<m;i++) { cin>>x>>y; //x>y f[x

poj 3660 Cow Contest(warshall算法)

poj 3660 Cow Contest Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the co

【UVA】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0

HDU 1317(Floyd判断连通性+spfa判断正环)

XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4421    Accepted Submission(s): 1252 Problem Description It has recently been discovered how to run open-source software on the Y-Crate gami

247 - Calling Circles (Floyd 求传递闭包)

该题恰好用到刚刚讲到的Floyd求传递闭包 , 因为该题的数据量不是很大, 要是大了估计就要用其他方法了 .  但是这毕竟是一个很简单易写的算法 . 求出传递闭包之后就用并查集将在一个电话圈的人合并在一起,最后输出 . 细节参见代码: #include<bits/stdc++.h> using namespace std; int n,m,d[30][30],par[30],kase = 0; string s1,s2; map<string , int > p; map<i

poj 2570 floyd+二进制

二进制真的是个神奇的东西! 类似floyd求传递闭包,这里g[i][j]表示i点到j点的状态(即符合条件的公司的集合). 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 201; 7 const int M = 31; 8 int g[N][N]; 9 int n; 10 11 int main () 12 {

hdu1317(spfa判断正环+Floyd判断联通)

题意很好理解,判断是否能从起点走到终点,每走到几个点就会获得这个点所代表的能量值,起点时自身带有100能量值. 刚开始写了个裸地spfa,超时了,发现可能存在从起点走不到终点,而且还存在正环,这样程序永远也不会结束,改正后用Floyd判断起点和终点是否联通,然后用spfa求最长路,遇到环中的点时判断,环中的点是否能到达终点,能到达则输出“winnable”,因为可以在正环中获得无限能量值. 不能的话继续做spfa, 并且环中的点不再进入队列,这个换就被破坏了,这样就算图中有多个环也能处理.若没有

floyd 传递闭包 POJ - 3660

https://vjudge.net/problem/POJ-3660 传递闭包 ,就是把具有传递性的关系传递开,通过一些已知的连边求出点与点之间的关系. 设f[i][j]表示i 与 j 是否联通,f[i][j]=f[i][k]&&f[k][j] 再分析每个点,如果能确定 n-1 个关系,那就可以确定他的排名. 时间复杂度O(N^3) #include <iostream> #include <cstdio> #include <cstring> #in

ACM: POJ 3660 Cow Contest - Floyd算法

链接 Cow Contest Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Eac