您的位置:首页 > 其它

hdu 1285 确定比赛名次

2011-04-25 20:44 197 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1285

这是一道拓扑排序的问题,题目比较简单,而且都提醒了所有点是连通的也就不需要用并查集判断是否连通了,不过要注意重边,万恶的重边,WA了几次,我原来写的代码冗余太大,看了一下别的童鞋写的,又给自己的代码优化了一下~~~~

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int map[501][501];
int team[501];
int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
//初始化
memset(map,0,sizeof(map));
memset(team,0,sizeof(team));
//录入数据
int P1,P2;
for(int i=1;i<=M;++i)
{
scanf("%d%d",&P1,&P2);
if(!map[P1][P2])
{
map[P1][P2]=1;
team[P2]++;
}
}
//
for(int i=1;i<=N;++i)
{
//找出最小的点
int min_num=1000;
for(int j=1;j<=N;++j)
{
if(team[j]==0)
{
team[j]=-1;
min_num=min(min_num,j);
break;
}
}
if(min_num==1000)
break;
if(i==1)
printf("%d",min_num);
else
printf(" %d",min_num);
for(int k=1;k<=N;++k)
if(map[min_num][k]==1)
team[k]--;
}
printf("/n");
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  优化