哈密尔顿回路

竞赛图哈密尔顿路 poj 1776
int g[N][N];
int sta[N],top;
void hami(int n){
    top=0;
    for(int i=1;i<=n;i++){
        int id=0;
        for(int j=top-1;j>=0;j--){
            if(g[sta[j]][i]){
                id=j+1;break;
            }
            else sta[j+1]=sta[j];
        }
        sta[id]=i;
        top++;
    }
}

/无向图哈密尔顿路/回路 HDU 4337
int g[N][N];
int sta[N],top;
int vis[N],dis[N];
int n,m;

void Ins(int u,int id){
    for(int i=top;i>id;i--)sta[i]=sta[i-1];
    sta[id]=u;
    top++;

    vis[u]=1;
    for(int i=0;i<n;i++)dis[i]|=g[u][i];
}

void flip(int l,int r){
    for(int i=0;i<(r-l+1)/2;i++){
        swap(sta[l+i],sta[r-i]);
    }
}
void adjust(){
    int st=sta[0],ed=sta[top-1];
    if(g[st][ed])return ;
    for(int i=1;i<=top-3;i++){
        int u=sta[i],v=sta[i+1];
        if(g[u][ed]&&g[st][v]){
            flip(i+1,top-1);
            return ;
        }
    }
}
void update(){
    if(top==0){
        Ins(0,0);return ;
    }
    int st=sta[0],ed=sta[top-1];
    for(int i=0;i<n;i++)if(!vis[i]&&g[ed][i]){
        Ins(i,top);return ;
    }
    for(int i=0;i<n;i++)if(!vis[i]&&g[i][st]){
        Ins(i,0);return ;
    }
    for(int i=0;i<n;i++)if(!vis[i]&&dis[i]){
        adjust();
        for(int j=0;j<top;j++){
            int u=sta[j];
            if(g[u][i]){
                flip(0,j);
                flip(j+1,top-1);
                Ins(i,0);
                return ;
            }
        }
    }
}
void hami(){
    memset(dis,0,sizeof(dis));
    memset(vis,0,sizeof(vis));
    top=0;
    for(int i=0;i<n;i++)update();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值