首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。