HDU1285 确定比赛名次
http://acm.hdu.edu.cn/showproblem.php?pid=1285
一个拓扑排序的题 这个题的输入数据保证正确 所以不用判断有没有解
一开始按书上的用栈还有邻接表的数据结构 写了半天没写出来 后来在网上看的这种用
1.G数组赋值:ij有边给ij赋值为1
2.D数组赋值:D[i]表示i点的入度
3.找N-1次,每次找到第一个入度为0的点 输出 并且把和这个点发出的边删掉(对应点的入度减一)
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 510;
int G[maxn][maxn];//图
int D[maxn];//入度
int main()
{
int N,M;
while(cin >> N >> M)//N个队伍 M场比赛
{
memset(G,0,sizeof(G));
memset(D,0,sizeof(D));
while(M--)
{
int a,b;
cin >> a >> b;
G[a][b] = 1;
}
for(int i = 1 ; i <= N ;i++)
{
for(int j = 1 ; j <= N ;j++)
{
if(G[i][j])
D[j]++;
}
}
for(int k = 1 ; k <= N ; k++)
{
int i;
for(i = 1 ; i <= N ; i++)
{
if(D[i]==0)
{
break;
}
}
cout<<i;
if(k!=N)
{
cout<<" ";
}
D[i]=-1;
for(int j = 1 ; j <= N ;j++)
{
D[j]-=G[i][j];
}
}
cout<<endl;
}
return 0;
}
主要是根据这个博客写的代码http://blog.csdn.net/xujinsmile/article/details/7837301