UVA 10305 - Ordering Tasks

版权声明:未经本人同意,禁止转载。 https://blog.csdn.net/qq_34022601/article/details/84311976

经典拓扑排序题目;

TopSort 思路:https://blog.csdn.net/qq_34022601/article/details/84303726

#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct Node{
	vector <int> arc;
};
int topnum[10010]; 	//存储Top排序的序列 
int indegree[10010];//入度数量 
void Topsort(Node *G,int n)
{
	queue <int> q;
	int v,counter=0;
	for (int i=1;i<=n;i++)
	{
		if (indegree[i]==0)
		{
			q.push(i);
		}
	}
	vector <int> :: iterator it;
	while (!q.empty())
	{
		v=q.front();
		q.pop();
		topnum[++counter]=v;
		for (it=G[v].arc.begin();it!=G[v].arc.end();it++)
		{
			indegree[*it]--;
			if (indegree[*it]==0)
				q.push(*it);
		}
	}
	for (int i=1;i<=n;i++)
	{
		printf ("%d",topnum[i]);
		if (i!=n)
		printf (" ");
	}
	printf ("\n");
}
int main()
{
	int n,m,x,y;
	while (~scanf ("%d %d",&n,&m) &&( n + m))	//注意n+m!=0 
	{
		Node G[10010];
		map  <pair<int,int>,int> mp;
		pair<int ,int > p;
		for (int i=0;i<m;i++)
		{
			scanf ("%d %d",&x,&y);
			p.first=x;p.second=y;
			if (mp[p]==0)//防止重复输入,使入度增加 
			{
				G[x].arc.push_back(y);
				indegree[y]++;
				mp[p]++;
			}
		}
		Topsort(G,n);
		memset(topnum,0,sizeof(topnum));
		memset(indegree,0,sizeof(indegree));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34022601/article/details/84311976