http://acm.sgu.ru/problem.php?contest=0&problem=101
要想有解 首先必须是一个联通图
而且度为奇数的点的个数要么为0要么为2 否则无解
有解dfs搜一下就可以 不过如果存在度为奇数的点 要从度为奇数的点开始搜
搜的时候需要记录边 用栈记录 注意入栈顺序
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#define ll long long
using namespace std;
const int N=7;
const int M=10005;
int head[N],I;
struct node
{
int j,next;
int k;
}edge[M];
int num[N],f[N];
bool visited[M];
stack<int>st;
int fx(int x)
{
if(f[x]!=x)
f[x]=fx(f[x]);
return f[x];
}
void add(int i,int j,int k)
{
edge[I].j=j;
edge[I].k=k;
edge[I].next=head[i];
head[i]=I++;
}
void dfs(int x)
{
visited[x]=true;
visited[x^1]=true;
for(int t=head[edge[x].j];t!=-1;t=edge[t].next)
{
if(!visited[t])
{
dfs(t);
}
}
st.push(edge[x].k);
}
int main()
{
//freopen("data.in","r",stdin);
int n;
while(cin>>n)
{
while(!st.empty()) st.pop();
memset(num,0,sizeof(num));
memset(head,-1,sizeof(head));I=0;
for(int i=0;i<N;++i)
f[i]=i;
int root;
for(int i=1;i<=n;++i)
{
int l,r;
cin>>l>>r;
f[fx(l)]=fx(r);
add(l,r,i);
add(r,l,-i);
++num[l];++num[r];
root=r;
}
vector<int>vt;
for(int i=0;i<N;++i)
if(num[i]>0)
vt.push_back(i);
int odd=0;
for(unsigned int i=0;i<vt.size();++i)
{
if(num[vt[i]]%2==1) {root=vt[i];++odd;}
if(i>0&&f[vt[i]]!=f[vt[i-1]]){odd=1;break;}
}
if(odd!=0&&odd!=2)
{cout<<"No solution"<<endl;}
else
{
memset(visited,false,sizeof(visited));
for(int t=head[root];t!=-1;t=edge[t].next)
if(!visited[t])
dfs(t);
while(!st.empty())
{
int k=st.top();st.pop();
cout<<abs(k)<<" ";
if(k>0)cout<<"+"<<endl;
else cout<<"-"<<endl;
}
}
}
return 0;
}