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;
}
}
#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;
}
}
相关文章推荐
- hdu 1285 确定比赛名次 //简单拓扑排序
- HDU 1285 确定比赛名次(简单拓扑排序)
- 确定比赛名次,hdu 1285 最简单的拓扑排序,
- hdu 1285 确定比赛名次_最简单的拓扑排序
- hdu 1285 确定比赛名次 简单的拓扑排序模板题~~需要注意重边
- hdu 1285 确定比赛名次 (简单的拓扑排序)
- HDU 1285 确定比赛名次(简单拓扑排序)
- hdu 1285 确定比赛名次 拓扑排序
- HDU 1285-确定比赛名次(拓扑排序)
- 拓扑排序 HDU 1285 确定比赛名次
- hdu 1285 拓扑排序起步
- HDU 1285 比赛排名(拓扑排序)
- HDU 1285 确定比赛名次 + HDU 4857 逃生(拓扑排序由浅入深)
- HDU 1285 确定比赛名次——拓扑排序
- HDU 3342 Legal or Not(简单拓扑排序判定)
- HDU 1285 确定比赛名次 (拓扑排序)
- hdu 1285 确定比赛名次(拓扑排序)
- hdu 1285(拓扑排序)
- HDU 1285 确定比赛名次 拓扑排序
- HDU 1285 确定比赛名次(拓扑排序)