说实话,现在我用的很多算法我都不会证明 :(
全部0ms,递归与否没有太大差别。
题目在这里:http://www.nocow.cn/index.php/Translate:USACO/fence
非递归版本:
/*
ID: creativ3
TASK: fence
LANG: C
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define SIZE 502
int stack[4*SIZE][2];
int fence[SIZE][SIZE];
int degree[SIZE];
int rec[SIZE];
int F,pos,top;
int euler(int start)
{
int i;
stack[top][0]=1;
stack[top][1]=start;
top++;
while(top)
{
top--;
i=stack[top][0];
start=stack[top][1];
if(degree[start])
for(;i<=500;i++) /* 这里有i++,所以标记tag-1的地方要i=0 */
if(fence[start][i])
{
fence[start][i]--;
fence[i][start]--;
degree[i]--;
degree[start]--;
/* 模拟系统保存状态,不过我们保存的是下一个状态 */
stack[top][0]=i+1;
stack[top][1]=start;
top++;
/* 模拟系统调用函数 */
start=i;
i=0; /*<= tag-1 */
}
rec[pos++]=start;
}
return 0;
}
int main(void)
{
int i,t1,t2,start;
freopen("fence.in","r",stdin);
freopen("fence.out","w",stdout);
/* read data */
scanf("%d",&F);
for(i=0;i<F;i++)
{
scanf("%d%d",&t1,&t2);
degree[t1]++;
degree[t2]++;
fence[t1][t2]++;
fence[t2][t1]++;
}
/* find starting node */
for(i=1;i<=500;i++)
if(degree[i])
{
start=i;
break;
}
for(;i<=500;i++)
if(degree[i]&0x1)
{
start=i;
break;
}
/* find euler path and ouput it */
euler(start);
for(i=pos-1;i>=0;i--)
printf("%d\n",rec[i]);
return 0;
}
递归版本:
/*
ID: creativ3
TASK: fence
LANG: C
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define SIZE 502
int fence[SIZE][SIZE];
int degree[SIZE];
int rec[SIZE];
int F,pos;
int euler(int start)
{
int i;
if(degree[start])
for(i=1;i<=500;i++)
if(fence[start][i])
{
fence[start][i]--;
fence[i][start]--;
degree[i]--;
degree[start]--;
euler(i);
}
rec[pos++]=start;
return 0;
}
int main(void)
{
int i,t1,t2,start;
freopen("fence.in","r",stdin);
freopen("fence.out","w",stdout);
/* read data */
scanf("%d",&F);
for(i=0;i<F;i++)
{
scanf("%d%d",&t1,&t2);
degree[t1]++;
degree[t2]++;
fence[t1][t2]++;
fence[t2][t1]++;
}
/* find starting node */
for(i=1;i<=500;i++)
if(degree[i])
{
start=i;
break;
}
for(;i<=500;i++)
if(degree[i]&0x1)
{
start=i;
break;
}
euler(start);
for(i=pos-1;i>=0;i--)
printf("%d\n",rec[i]);
return 0;
}
1万+

被折叠的 条评论
为什么被折叠?



