您的位置:首页 > 其它

hdu 1285 确定比赛名次

2012-08-13 10:52 225 查看
题意: 拓扑排序,按字典序输出。

#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int n,m , top;
int vis[510][510];
int ans[510];
struct E
{
int v, next;
}e[20010];
struct N
{
int head , dep , rd;
}node[610];
void insert(int u,int v)
{
e[top].v=v; e[top].next = node[u].head;
node[v].rd++;  node[u].head=top++;
}
void Top_sort()
{
int i,j;
for(i=1;i<=n;i++)   //保证会按字典序输出
{
for(j=1;j<=n;j++)
{
if(node[j].rd==0)   break;
}
if(j>n) return;  //每找到入度为0的(出现环,或已遍历完)
ans[i]=j;        //把找到入度为0的存入ans[]
node[j].rd=-1;    //保证j点不会被再次找到
for(int k=node[j].head; k!=NULL; k=e[k].next)  //输给第j个队的所有队入度-1
//这样也保证了p1 p2一定会是p1排在p2前
{
int p= e[k].v;
--node[p].rd;
}
}
}
int main()
{
int u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
top=1;
memset(node,0,sizeof(node));
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
if(vis[u][v]==0)
insert(u,v);
vis[u][v]=1;
}
Top_sort();
for (int i = 1; i <= n; ++i)
{
printf("%d%c", ans[i], i == n ? '\n' : ' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: