SGU 122 The book 满足ore性质的哈密尔顿回路求法

原创 2012年03月26日 17:31:11

这题ac的不容易啊,知道怎么做但是还是出现了许多错误,导致无限re。。。

由题目的条件知道图满足ore性质,所以有O(n2)的算法,1000个点,不会超时~

#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 = 1011;

bool b[maxn][maxn];
bool link[maxn][maxn];
bool vis[maxn];
int s,t;
int re;
deque<int>z[maxn];
int a[maxn];
vector<int>v;
bool quan;
int n;
char ss[52202];
string sc;


void find(int now)
{
    for(int to=1;to<=n;to++)
    {
        if(b[now][to] && !vis[to])
        {
            vis[to]=true;
            v.pb(to);
            link[now][to]=true;
            link[to][now]=true;
            z[now].pb(to);
            z[to].pb(now);
            re++;
            t = to;
            find(to);
            return ;
        }
    }
}


void make_ring()
{
    if(b[t][s]==true)
    {
        link[s][t] = link[t][s] = true;
        z[s].pb(t);
        z[t].pb(s);
        quan = true;
        return ;
    }
    MM(a,0);
    int now,to;
    a[1]=s;
    a[2]=z[s][0];
    now=z[s][0];
    int temp = 2;
    while(true)
    {
        FF(i,z[now].size())
        {
            to=z[now][i];
            if(to!=a[temp-1])
            {
                now = to;
                a[temp+1] = to;
                temp++;
                break;
            }
        }
        if(a[temp]==t)
        {
            break;
        }
    }

    for(int i=2;;i++)
    {
        if(b[s][a[i+1]] && b[a[i]][t] )
        {
            link[a[i]][a[i+1]] = false;
            link[a[i+1]][a[i]] = false;
            link[a[i+1]][s] = link[s][a[i+1]] = true;
            link[t][a[i]] = link[a[i]][t] = true;
            z[a[i]].clear();
            z[a[i+1]].clear();
            z[a[i]].pb(a[i-1]);
            z[a[i]].pb(t);
            z[a[i+1]].pb(s);
            z[a[i+1]].pb(a[i+2]);
            z[s].pb(a[i+1]);
            z[t].pb(a[i]);
            quan=true;
            return ;
        }
    }
}

void add()
{
    int now,to;
    int net;
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            now = i;
            FF(j,v.size())
            {
                to = v[j];
                if(b[now][to])
                {
                    net = z[to][1];
                    z[to].pop_back();
                    if(to==z[net][0])
                    {
                        z[net].pop_front();
                    }
                    else if(to ==z[net][1])
                    {
                        z[net].pop_back();
                    }
                    link[to][net] = link[net][to] = false;
                    link[now][to] = link[to][now] = true;
                    s=now;
                    t=net;
                    z[to].pb(now);
                    z[now].clear();
                    z[now].pb(to);
                    re++;
                    vis[now]=true;
                    quan =false;
                    return ;
                }
            }
        }
    }
}

void start()
{
    MM(link,false);
    v.clear();
    quan = false;
    re=1;
    vis[1]=true;
    v.pb(1);
    s=t=1;
    while(re<n)
    {
        find(t);
        if(quan==false)
        {
            make_ring();

        }
        if(re>=n)
        {
            break;
        }
        else
        {
            if(quan==true)
            add();
        }
    }

    if(!quan)
    {
        make_ring();
    }
    MM(a,0);
    a[0]=1;
    a[1]=z[1][0];
    int now=a[1],to;
    int temp = 1;
    int step = 1;
    while(step<=n+1)
    {
        FF(i,z[now].size())
        {
            to = z[now][i];
            if(to!=a[temp-1])
            {
                a[temp+1] = to;
                now = to;
                temp++;
                break;
            }
        }
        step++;
    }
    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<"1"<<endl;
    return ;
}

int main()
{
    while(cin>>n)
    {

        FF(i,maxn)
        {
            z[i].clear();
        }
        MM(b,false);
        int now;
        cin.getline(ss,200);
        for(int kk=1;kk<=n;kk++)
        {
            cin.getline(ss,50200);
            sc = ss;
            sc += " ";
            now = 0;
            for(int i=0;i<sc.length();i++)
            {
                if(sc[i]==' ')
                {
                    if(now)
                    {
                        b[kk][now] = b[now][kk] = true;
                    }
                    now = 0;
                }
                else
                {
                    now*=10;
                    now+=sc[i]-'0';
                }
            }
        }
        if(n==2)
        {
            cout<<"1 2 1\n"<<endl;
            continue;
        }
        start();
    }
    return 0;
}


相关文章推荐

SGU 122 The book(哈密顿图)

Description 给出一个n个点的无向图,每个点的度数不小于[(n+1)/2],求一条从1开始的哈密顿回路 Input 第一行一个整数n表示点数,之后n行每行为一个点的邻接表 Outpu...
  • V5ZSQ
  • V5ZSQ
  • 2016年04月15日 10:13
  • 437

sgu 122 The book

题目描述: 122. The book time limit per test: 0.5 sec. memory limit per test: 4096 KB There ...
  • utoppia
  • utoppia
  • 2012年10月31日 21:17
  • 427

SGU122 The book

给出一张N个点的无向图,每个点的度数至少为⌊(N+1)/2⌋,找出一条哈密顿回路...

SGU 122. The book 哈密尔顿回路 构造

题目链接点这儿 就是给一张无向图,让你求一个从起点遍历所有点返回

Matlab经典算法哈密尔顿回路

  • 2008年05月30日 10:55
  • 15KB
  • 下载

Granny's Bike(哈密尔顿回路--深搜,回溯)

Granny's Bike Most days Granny rides her bike around town to do errands, visit, have a cup of coffe...

哈密尔顿回路

转载自:http://www.cnblogs.com/zhj5chengfeng/p/3233992.html 哈密尔顿回路总结   一、引子   1959 年 Wi...

哈密尔顿回路问题

/*******************************************************/ /* 哈密尔顿回路问题 ...

poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题

很经典的状态压缩dp问题
  • neng18
  • neng18
  • 2014年04月17日 21:01
  • 1059

hdu 4337——poj 2438(哈密尔顿回路求解模板)

转:http://imlazy.ycool.com/post.2072698.html   Dirac 定理:设一个无向图中有 N 个节点,若所有节点的度数都大于等于 N/2,则汉密尔顿回路一定存在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SGU 122 The book 满足ore性质的哈密尔顿回路求法
举报原因:
原因补充:

(最多只允许输入30个字)