POJ

来源:互联网 发布:2016淘宝如何打造爆款 编辑:程序博客网 时间:2024/06/10 13:01

题意:

给定两个人之间的胜负关系,问有几个人的名次可以确定

思路:

跑完 floyd,可以知道根据给定关系能推出来的所有胜负关系,

然后某个人跟其他 n-1 个人的胜负关系可知的话,他的名次就是可知的


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 100 + 7, maxd = (1<<18)-1, mod = 1e9 + 7;const int INF = 0x7f7f7f7f;int n, m;bool f[maxn][maxn];void init() {    memset(f, 0, sizeof f);    for(int i = 0; i < m; ++i) {        int u, v;        scanf("%d %d", &u, &v);        f[u][v] = true;    }}void solve() {    for(int k = 1; k <= n; ++k) {        for(int i = 1; i <= n; ++i) {            if(i == k) continue;            for(int j = 1; j <= n; ++j) {                if(j == k || j == i) continue;                if(f[i][k] && f[k][j]) f[i][j] = true;            }        }    }//    for(int i = 1; i <= n; ++i) {//        for(int j = 1; j <= n; ++j)//            cout << f[i][j] << " ";//        cout << endl;//    }    int ans = 0;    for(int i = 1; i <= n; ++i) {        int flag = 1;        for(int j = 1; j <= n; ++j) {            if(i == j) continue;            if(!f[i][j] && !f[j][i]) { flag = 0; break; }        }        if(flag) ans++;    }    cout << ans << endl;}int main() {    while(~scanf("%d %d", &n, &m) && n+m) {        init();        solve();    }    return 0;}


原创粉丝点击