题目大意:
给你一个有向图让你判断是否有环,有输出"Yes",否则输出"No",现有t个测例(1 ≤ t ≤ 15),每个测例中的图用邻接矩阵表示(矩阵为正方形的),边长为N(0 < N ≤ 2,000),矩阵中0表示没有边,1表示从i到j有一条有向边,矩阵中只有0和1,每行中01都是紧密相连的,中间没有空格隔开,对于每个测例,如果有环输出"Yes",否则输出"No"。
代码:
/*
* Problem ID : HDU 4324 Triangle LOVE
* Author : Lirx.t.Una
* Language : C++
* Run Time : 203 ms
* Run Memory : 4160 KB
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define MAXN 2000
using namespace std;
char g[MAXN][MAXN + 1];
short deg[MAXN];
queue<short> que;
bool
topsort(int n) {
int i;
int u, v;
for ( i = 0; i < n; i++ )
if ( !deg[i] )
que.push(i);
for ( i = 0; i < n; i++ ) {
if ( que.empty() ) return false;
u = que.front();
que.pop();
for ( v = 0; v < n; v++ )
if ( '1' == g[u][v] && !(--deg[v]) )
que.push(v);
}
return true;
}
int
main() {
int t, iscn;
int n;
int i, j;
scanf("%d", &t);
iscn = 0;
while ( t-- ) {
memset(deg, 0, sizeof(deg));
scanf("%d", &n);
for ( i = 0; i < n; i++ ) scanf("%s", g[i]);
for ( i = 0; i < n; i++ )
for ( j = 0; j < n; j++ )
if ( '1' == g[i][j] )
deg[j]++;
printf("Case #%d: ", ++iscn);
if ( topsort(n) ) puts("No");
else puts("Yes");
}
return 0;
}