[欧拉路径] POI 1996 Stage II Problem 3 Gambling
2016-12-06 21:10
183 查看
详见:http://blog.sina.com.cn/s/blog_51cea4040100hf8v.html
n个发生器就是n个点,边是每个发生器到它产生的数字,单向边。
那么,这题要做的事就变成,走一条路,使得在无路可走的时候,要么是没有停在n点,要么是没有遍历所有的边。
如果图不是欧拉路图:那么,我们随便dfs找条路就OK啦。
如果图是欧拉路:
如果结束点不在n:那么,我们也输出这条路。
如果结束点在n:去掉与n相连的边,判断剩下的图中是否存在环。
如果存在:那么去掉环之后,重新找条欧拉路,输出路径。
如果不存在:那么游戏失败。
n个发生器就是n个点,边是每个发生器到它产生的数字,单向边。
那么,这题要做的事就变成,走一条路,使得在无路可走的时候,要么是没有停在n点,要么是没有遍历所有的边。
如果图不是欧拉路图:那么,我们随便dfs找条路就OK啦。
如果图是欧拉路:
如果结束点不在n:那么,我们也输出这条路。
如果结束点在n:去掉与n相连的边,判断剩下的图中是否存在环。
如果存在:那么去掉环之后,重新找条欧拉路,输出路径。
如果不存在:那么游戏失败。
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=1005; struct edge{ int u,v,next; }G[N*N]; int head ,inum; int vst[N*N]; inline void add(int u,int v,int p){ G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p; } int n,m; int path[N*N],pnt; #define V G[p].v int totm; inline void dfs1(int u){ for (int p=head[u];p;p=G[p].next) if (!vst[p]){ vst[p]=1; totm++; dfs1(V); path[++pnt]=V; return; } } inline void Print(){ for (int i=2;i<=pnt;i++) printf("%d ",path[i]); printf("0\n"); } int tag ; int S ,g; int st; inline bool dfs2(int u){ tag[u]=1; for (int p=head[u];p;p=G[p].next) if (V<n && !tag[V]){ S[++*S]=p; if (!dfs2(V)) S[(*S)--]=0; else return 1; } else if (V==st){ g=p; return 1; } return 0; } int main(){ int tem,a; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); for (int i=1;i<=n;i++){ read(tem); for (int j=1;j<=tem;j++) read(a),add(i,a,++inum); } if (n==1){ printf("NIE\n"); return 0; } dfs1(1); path[++pnt]=1; reverse(path+1,path+pnt+1); if (path[pnt]!=n || totm<inum){ Print(); return 0; }else{ int flag=0; for (st=1;st<n;st++){ memset(tag,0,sizeof(tag)); if (flag|=dfs2(st)) break; } if (!flag){ printf("NIE\n"); return 0; } memset(vst,0,sizeof(vst)); for (int i=1;i<=*S;i++) vst[S[i]]=1; vst[g]=1; pnt=0; dfs1(1); path[++pnt]=1; reverse(path+1,path+pnt+1); Print(); } return 0; }
相关文章推荐
- 三色二叉树 [POI VI Stage 3 Problem 1,codevs 2462]
- Football Gambling II(zoj3356,贪心)
- HDU 1023 Train Problem II 卡特兰数 大数的乘法除法
- SCU2016-01 J 题 欧拉路径
- 【杭电】 1002 A + B Problem II
- B - A + B Problem II HDU - 1002 (大数相加问题)
- 欧拉路径和欧拉回路的路径
- [LeetCode]problem 213. House Robber II
- HDU 5424 Rikka with Graph II 哈密顿路径+dfs找环
- hdu 1002 A + B Problem II
- 【LeetCode-面试算法经典-Java实现】【063-Unique Paths II(唯一路径问题II)】
- hdoj 1002 A + B Problem II(大数加法)
- POJ 2337 - Catenyms 按所需的字典序输出欧拉路径..
- problem中Project'XX'is missing required library:'[路径]\XXX.jar'解决方法
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
- HDU1002 A + B Problem II
- HDU 1002 A + B Problem II (Java 之大整数)
- HDU——A + B Problem II
- poj 2337 Catenyms(欧拉路径的最小字典序)
- A + B Problem II(大数加法hd1002)