sgu上的题果然超有意思,挺难的,让哥找回了刚刚接触acm时候的感觉,这样才有意思~
这道题是求一个欧拉回路,差点没看出来以为是求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;
}