SGU 101 Domino 里程碑2——开始刷sgu!
2012-03-17 16:06
369 查看
sgu上的题果然超有意思,挺难的,让哥找回了刚刚接触acm时候的感觉,这样才有意思~
这道题是求一个欧拉回路,差点没看出来以为是求hamilton链,超时,这种就是特殊的hamilton链能转换为欧拉回路的情况,可惜普通的hamilton链不能变成欧拉回路,能的话np就等于p了~
这道题是求一个欧拉回路,差点没看出来以为是求hamilton链,超时,这种就是特殊的hamilton链能转换为欧拉回路的情况,可惜普通的hamilton链不能变成欧拉回路,能的话np就等于p了~
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<cmath> #include<cassert> #include<cstring> #include<iomanip> using namespace std; #ifdef _WIN32 #define i64 __int64 #define out64 "%I64d\n" #define in64 "%I64d" #else #define i64 long long #define out64 "%lld\n" #define in64 "%lld" #endif #define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++) #define FF(i,a) for( int i = 0 ; i < (a) ; i ++) #define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --) #define S64(a) scanf(in64,&a) #define SS(a) scanf("%d",&a) #define LL(a) ((a)<<1) #define RR(a) (((a)<<1)+1) #define SZ(a) ((int)a.size()) #define PP(n,m,a) puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");} #define pb push_back #define CL(Q) while(!Q.empty())Q.pop() #define MM(name,what) memset(name,what,sizeof(name)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) const int inf = 0x3f3f3f3f; const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL; const double oo = 10e9; const double eps = 10e-10; const double pi = acos(-1.0); const int maxn = 111; struct zz { int x; int y; }zx[maxn]; bool vis[maxn]; bool sw[maxn]; vector<int>link[7]; vector<int>gx[maxn]; vector<int>gy[maxn]; int ans[maxn]; int num[7]; int f[7]; int n; void init() { FF(i,7) { link[i].clear(); f[i] = i; } FF(i,maxn) { gx[i].clear(); gy[i].clear(); } MM(vis,false); MM(sw,false); MM(num,0); MM(ans,0); return ; } int fd(int now) { if(now != f[now]) { return f[now] = fd(f[now]); } return now; } bool find(int now,bool z,int step=1) { if(step == n) { return true; } int to; int xy; bool tz; if(!z) { xy = zx[now].y; FF(i,gy[now].size()) { to = gy[now][i]; if(vis[to]) { continue; } vis[to] = true; ans[step+1] = to; if(xy == zx[to].x) { tz = false; sw[step+1] = false; } else { tz = true; sw[step+1] = true; } if(find(to,tz,step+1)) { return true; } vis[to] = false; } } else { xy = zx[now].x; FF(i,gx[now].size()) { to = gx[now][i]; if(vis[to]) { continue; } vis[to] = true; ans[step+1]=to; if(xy == zx[to].x) { tz = false; sw[step+1] = false; } else { tz = true; sw[step+1] = true; } if(find(to,tz,step+1)) { return true; } vis[to] = false; } } return false; } void start(int sss) { FOR(i,1,n) { gx[i] = link[zx[i].x]; gy[i] = link[zx[i].y]; } int ti; bool zw; if(sss!=-1) { for(int i=1;i<=n;i++) { if(zx[i].x==sss) { ti = i; zw = false; break; } else if(zx[i].y==sss) { ti = i; zw = true; break; } } } else { ti = 1; zw = false; } MM(vis,false); vis[ti]=true; ans[1] = ti; sw[1] = zw; find(ti,zw); return ; } int main() { while(cin>>n) { init(); for(int i=1;i<=n;i++) { cin>>zx[i].x; cin>>zx[i].y; num[zx[i].x]++; num[zx[i].y]++; f[fd(zx[i].x)] = fd(zx[i].y); if(zx[i].x != zx[i].y) { link[zx[i].x].push_back(i); link[zx[i].y].push_back(i); } else { link[zx[i].x].push_back(i); } } int cut=0; int tmp=-1; FF(i,7) { if(num[i]%2 != 0) { cut++; tmp = i; } } int temp; for(int i=0;i<7;i++) { if(num[i]==0) { continue; } else { temp = fd(i); } } for(int i=0;i<7;i++) { if(!num[i]) { continue; } else { if(fd(i) != temp ) { cout<<"No solution"<<endl; continue; } } } if(cut > 2 ) { cout<<"No solution"<<endl; continue; } start(tmp); FOR(i,1,n) { cout<<ans[i]<<" "; if(!sw[i]) { cout<<"+"; } else { cout<<"-"; } cout<<endl; } } return 0; }
相关文章推荐
- sgu 101 Domino 解题报告及测试数据
- SGU 101 Domino(欧拉路径)
- SGU101 - Domino
- SGU 101 Domino 欧拉通路/回路
- SGU 101 Domino(无向图的欧拉路径)
- SGU 101 Domino 欧拉通路/回路
- sgu 101 Domino
- SGU 101 domino
- SGU 101 Domino
- sgu 101 Domino【输出欧拉路径】
- sgu-101-Domino
- SGU 101 Domino (欧拉路径 并查集)
- sgu 101 Domino (欧拉路)
- SGU 101 Domino
- sgu 101 Domino 欧拉通路
- SGU 101 Domino(欧拉图)
- Domino - SGU 101 (欧拉路径)
- SGU 101 Domino【欧拉路径】
- SGU101 Domino 留坑
- SGU 101 Domino 翻译 题解