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