您的位置:首页 > 其它

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

2012-03-17 16:06 369 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: