2 5 00100 10000 01001 11101 11000 5 01111 00000 01000 01100 01110
Case #1: Yes Case #2: No
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define maxn 2010
using namespace std;
char map[maxn];
int indu[maxn];
int head[maxn], cnt;
int n, k;
struct node {
    int u, v, next;
};
node edge[maxn * maxn];
void init(){
    cnt = 0;
    memset(head, -1, sizeof(head));
    memset(indu, 0, sizeof(indu));
}
void add(int u, int v){
    edge[cnt] = {u, v, head[u]};
    head[u] = cnt++;
}
void input(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        scanf("%s", map);
        for(int j = 0; j < n; ++j)
            if(map[j] == '1'){
                add(i, j);
                indu[j]++;
            }
    }
}
void topsort(){
    printf("Case #%d: ", ++k);
    queue<int >q;
    int ans = 0;
    for(int i = 0; i < n; ++i){
        if(!indu[i]){
            q.push(i);
            ans++;
        }
    }
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(int i = head[u]; i != -1; i = edge[i].next){
            int v = edge[i].v;
            indu[v]--;
            if(!indu[v]){
                q.push(v);
                ans++;
            }
        }
    }
    if(n == ans)
        printf("No\n");
    else
        printf("Yes\n");
}
int main (){
    int T;
    scanf("%d", &T);
    k = 0;
    while(T--){
        init();
        input();
        topsort();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4324-- Triangle LOVE【拓扑排序 && 邻接表实现】
原文:http://blog.csdn.net/hpuhjh/article/details/47659563