您的位置:首页 > 其它

HDU-1285简单的拓扑排序

2013-08-28 10:50 239 查看
拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。1、拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。 2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路 3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序 

#include<iostream>
#include<cstring>
using namespace std;
int map[501][501],into[501],ans[501];
int n;
void topu()
{
int i,j,k;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(map[i][j])
into[j]++;//记录每个点的入度
}

for(i=1; i<=n; i++)
{
k=1;//每次从第一个节点开始查找入度为0的点
while(into[k]!=0)k++;//找到入度为0的点,因为题目说明必有排名,所以必存在入度0
ans[i]=k;//记录答案
into[k]--;//将其抛弃,入度变为-1
for(j=1; j<=n; j++)
{
if(map[k][j])
into[j]--;//与k有关的入度都-1
}
}
}
int main()
{
int m,a,b,i;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(into,0,sizeof(into));
while(m--)
{
cin>>a>>b;
map[a][b]=1;
}
topu();
for( i=1; i<=n; i++)
{
cout<<ans[i];
if(i!=n)cout<<" ";//注意最后一个不要输出空格
}
cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: