传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1285
这道题是给出了DAG(有向无环图),来实现排名次的功能。
对此有专门的拓扑算法:从图中找出入度为0的点并弹出,依次循环往复。
代码如下:
首先是利用邻接矩阵的实现,这是最符合代码本意的:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000;
int map[maxn][maxn];int in[maxn];
int main(void)
{
int n,m;
int a,b;
int i,j,k;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
int cnt=0,pos;
for(i=0;i<m;i++)
{
cin>>a>>b;
if(map[a][b]==0)
{
map[a][b]=1;
in[b]++;
}
}
while(cnt<n) //第一次写成了cnt<=n,造成一直处于死循环状态
{
for(i=1;i<=n;i++)
{
if(in[i]==0) {cnt++;pos=i;in[i]-=1;break;} //这里本来还是想用visit数组来保存是否已访问的,后来觉得没有必要,只要保证它不为0就可以了
}
if(cnt<=n-1) cout<<pos<<" ";
else cout<<pos<<endl;
for(i=1;i<=n;i++)
if(map[pos][i]==1) in[i]--;
}
}
}