您的位置:首页 > 其它

UVA 10305 Ordering Tasks(拓扑排序)

2017-09-08 22:27 477 查看

[题目链接(https://vjudge.net/problem/UVA-10305)

题意

n个变量,(u,v)表示u要在v前面,给出所有的(u,v)关系,询问一个合适的排序方案

解决

典型的拓扑排序

具体可以看下代码注释

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=110;
bool maps

;
int degree
,n,m;

void init()
{
for(int i=0;i<=n;i++)
{
degree[i]=0;
for(int j=0;j<=n;j++)
{
maps[i][j]=false;
}
}
}

void input()
{
int u,v;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
degree[v]++;
maps[u][v]=true;
}
}

void solve()
{
int s;
vector<int> v;              //用来存储拓扑排序结果
queue<int> q;
for(int i=1;i<=n;i++)
{
if(degree[i]==0)        //入度为0的入队(可能不止一个)
q.push(i);
}
while(!q.empty())
{
int s=q.front();        //取出队首元素
q.pop();
v.push_back(s);
for(int i=1;i<=n;i++)
{
int t=i;
if(maps[s][t])
{
degree[t]--;    //删除了s,t的入度减一
if(degree[t]==0)    //入度如果为0,入队
q.push(t);
}
}
}
printf("%d",v[0]);          //注意下输出
for(int i=1;i<v.size();i++)
{
printf(" %d",v[i]);
}
puts("");
}

int main()
{
while(1)
{
scanf("%d%d",&n,&m);
if(!n&&!m) break;
init();
input();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva