题目链接:确定比赛名次
题目分析:若P1赢了P2,则在连一条边P1-->p2,对所有结点排序,求得一个序列,使得每一条有向边(u, v)对应的u都排在v的前面
方法一:
dfs,白书上讲的方法,但该方法不能保证输入的顺序
vis[u]=0表示从来没有访问过(从来没有调用过dfs(u));
vis[u]=1表示已经访问过,并且还递归访问过它的所有子孙(即dfs(u)曾被调用过,并已返回);这表示u已经包含在一个拓扑排序当中
c[u]=-1表示正在访问(即递归调用dfs(u)正在栈帧中,尚未返回),这表明有一个环,不满足拓扑排序,返回一个错误
#include <stdio.h>
#include <memory.h>
const int maxn=500+5;
int n,g[maxn][maxn],vis[maxn],st[maxn],cnt;
void init()
{
cnt=n;
memset(g,0,sizeof(g));
mem