竞赛图哈密尔顿路 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();
}
哈密尔顿回路
最新推荐文章于 2022-04-04 14:54:48 发布