sgu122 分类: sgu 2015-02-15 11:39 71人阅读 评论(0) 收藏
构造题
改图满足Ore性质,是个很强的性质
1>先随机找到一条链。
2>如果这条链长度小于n,通过变换使其变成环(根据Ore性质可证明可行),
然后,选取不在环中的结点,找到相应位置,将环断开形成链,再将结点插入这条链,
不断重复这个过程直到链的长度等于n
3>通过变换使链变成环,输出路径
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#define MAXN 1005
#define SIZE 10005
int n;
bool mp[MAXN][MAXN]={false};
char ch[SIZE]={'\0'};
int cl;
bool hash[MAXN]={false};
int head,tail;int pre[MAXN]={false},sur[MAXN]={false};
int wl=0;
int numch(int l,int r)
{
int i,ret=0;
for(i=l;i<=r;i++)
{
ret*=10;
ret+=ch[i]-'0';
}
return ret;
}
void dfs(int a)
{
int i;
hash[a]=true;wl++;tail=a;
for(i=1;i<=n;i++)
if(mp[a][i]==true && hash[i]==false)
{sur[a]=i,pre[i]=a;dfs(i);return;}
}
void roll()
{
int j,p,k,tmp;
for(j=head;sur[j]!=false;j=sur[j])
if(mp[j][tail]==true && mp[head][sur[j]]==true)
{
p=sur[j];
sur[j]=tail;
pre[head]=p;
// tail~p
for(k=tail;;k=sur[k])
{
tmp=pre[k];
pre[k]=sur[k];
sur[k]=tmp;
if(k==p)break;
}
pre[tail]=j;
sur[p]=head;
return;
}
}
void find()
{
int i,j,k;
for(i=1;i<=n;i++)
if(hash[i]==false)
for(j=1;j<=n;j++)
if(mp[i][j]==true && hash[j]==true)
{
head=i;tail=pre[j];
hash[i]=true;wl++;
sur[pre[j]]=false;
pre[j]=i;
sur[i]=j;
return;
}
}
int main()
{
int i,j,q;
#ifndef ONLINE_JUDGE
freopen("sgu122.in","r",stdin);
freopen("sgu122.out","w",stdout);
#endif
scanf("%d",&n);
for(q=1;q<=n;q++)
{
while(scanf("%s",ch)!=EOF)
{
mp[q][numch(0,strlen(ch)-1)]=true;
if(getchar()=='\n')break;
}
}
head=1;
dfs(1);
while(wl<n)
{
roll();
find();
}
roll();
printf("1 ");
for(i=sur[1];i!=1;i=sur[i])
{
printf("%d ",i);
}
printf("1");
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。