SGU 101 Domino 里程碑2——开始刷sgu!

来源:互联网 发布:淘宝供销货源 编辑:程序博客网 时间:2024/04/30 19:26

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;}