标签:sgu
题目大意:
给你一个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
原文地址:http://blog.csdn.net/qq_21995319/article/details/43378591