UVA

题目:

思路:

如图E:图中a、b、c、d是有向图D中的顶点,如果ac、bc都指向cd,而ac又指向ce,那bc同样应该有一条指向ce的边不然就不能从图D转换来。所以直接枚举顶点就可以了。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 310;
int mp[maxn][maxn];
int m,k;

bool judge() {
    for(int i=0; i<m; i++) {
        for(int j=0; j<m; j++) {
            if(i==j) continue;
            bool ok=true,ook=true;
            for(int p=0; p<m; p++) {
                if(i==p||j==p) continue;
                if(mp[i][p] && !mp[j][p]) {
                    ook = false;
                }
                if(mp[j][p] && !mp[i][p]) {
                    ook = false;
                }
                if(mp[i][p] && mp[j][p]) {
                    ok = false;
                }
            }
            if(!ok&&!ook){
                return false;
            }
        }
    }
    return true;
}

int main() {
    //FRE();
    int kase,st,en;
    scanf("%d",&kase);
    for(int o=1; o<=kase; o++) {
        memset(mp,0,sizeof(mp));
        scanf("%d%d",&m,&k);
        for(int i=0; i<k; i++) {
            scanf("%d%d",&st,&en);
            mp[st][en] = 1;
        }

        if(!judge()) {
            printf("Case #%d: No
",o);
        } else {
            printf("Case #%d: Yes
",o);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sykline/p/10354643.html