test:
4 3
0 1
2 1
3 2
4 4
0 1
1 2
2 3
3 0
代码:
#include<stdio.h>
#include<string.h>
const int maxn = 100;
int map[maxn][maxn];
int status[maxn];
int topo_order[maxn];
int num;
int cur;
bool topo(int v)
{
status[v] = -1;
for(int u = 0; u < num; ++u)
{
//loop: find the longest paths from every point connected to u
if(map[v][u])
{
//status[u] == -1: u is a point somewhere on the path we are travelling
if(status[u] == -1)
return false;
else if(!status[u])
{
bool res = topo(u);
if(!res) return false;
}
/*status[u] == 1: no need to go on b/c
we have already find the longest path without a circle
starting from u
*/
}
}
status[v] = 1;
topo_order[--cur] = v;
return true;
}
int main()
{
//
freopen("input.txt", "r", stdin);
int pair;
while(scanf("%d%d", &num, &pair) == 2)
{
memset(map, 0, sizeof(map));
memset(status, 0, sizeof(status));
int n1, n2;
for(int i = 0; i < pair; ++i)
{
scanf("%d%d", &n1, &n2);
map[n1][n2] = 1;
}
cur = num;
//find a longest/complete path starting from each point in the graph(i.e. a, b, c, d)
//if there is a circle in the path, then fail
bool ok = true;
for(int i = 0; i < num; ++i)
{
if(!status[i])
{
if(!topo(i))
{
//at least one circle in those paths
ok = false;
break;
}
}
}
if(ok)
{
for(int i = 0; i < num; ++i)
{
putchar('a' + topo_order[i]);
}
}
else
{
printf("contraditory");
}
putchar('\n');
}
}