首页 > 代码库 > sgu-230 Weighings

sgu-230 Weighings

 题目大意:

给你一个n个点,m条边的有向图,然后要你求出一条经过所有点的路径,输出第i个点是第几个经过的。



解题思路:

话说这道题目我看了好久才看懂啊,毕竟英语差啊。。。。。

很水的一道题目,就是一遍拓扑排序就行了,没什么可讲的了。。。


AC代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)>(b)?(b):(a))

using namespace std;
int n,m;
struct bian_
{
	int next;
	int num;
}bian[10010]={{0,0}};
int First[110]={0};
int hash[110]={0};
int du[110]={0};

inline void Add(int p,int q,int k)
{
	bian[k].next=First[p];
	bian[k].num=q;
	First[p]=k;
	return;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int p,q;
		scanf("%d%d",&p,&q);
		Add(p,q,i);
		du[q]++;
	}
	int dui[110]={0};
	int duip=0;
	for(int i=1;i<=n;i++)
		if(du[i]==0) dui[++duip]=i;
	for(int i=1;i<=duip;i++)
	{
		int u=dui[i];
		for(int p=First[u];p!=0;p=bian[p].next)
		{
			du[bian[p].num]--;
			if(du[bian[p].num]==0)
				dui[++duip]=bian[p].num;
		}
	}
	if(duip<n) cout<<"No solution"<<endl;
	else
	{
		int ans[110]={0};
		for(int i=1;i<=n;i++)
			ans[dui[i]]=i;
		for(int i=1;i<=n;i++)
			printf("%d ",ans[i]);
		puts("");
	}
	return 0; 
}


sgu-230 Weighings