骑马修栅栏

来源:互联网 发布:淘宝网充气沙发 编辑:程序博客网 时间:2024/04/25 18:59
Problem Description农民John每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。John是一个和其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个一个栅栏。你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点)。一个顶点上可连接任意多(>=1)个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。我们如果把输出的路径看出是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个(也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的...)。输入数据保证至少有一个解。Input输入有多组数据,每组数据的第1行一个整数F(1<=F<=1024),表示栅栏的数目。第2到F+1行:每行两个整数i,j(1<=i,j<=500),表示这条栅栏连接i与j号顶点。Output对于每组数据输出应当有F+1行,每行一个整数,依次表示路径经过的顶点号。注意数据可能有多组解,但是只有上面题目要求的第一组解是认为正确的。Sample Input91 22 33 44 24 52 55 65 74 6Sample Output1234254657/*     解题报告:  欧拉回路:对于一个无向图,如果它每个点的度都是偶数,那么它存在一条欧拉回路;                 如果有且仅有2个点的度为奇数,那么它存在一条欧拉路;如果超过2个点的度为奇数,                 那么它就不存在欧拉路了。                 题中说明至少有一个点,至少有一条欧拉回路。                 如果有2个度数为奇数的点,那么就只能也这两个点之一为起点,另一个为终点。                 题目要求我们输出的是进行进制转换之后最小的,所以我们要以最小的点做起点。*///标程:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int temp[5000], edge[505][505], k;int maxn, minn;int min(int x,int y){return x < y ? x : y;}int max(int x,int y){return x > y ? x : y;}void dfs(int v){    for(int i=minn;i<=maxn;i++)       if( edge[v][i])   {             edge[v][i]--;             edge[i][v]--;             dfs(i);       }    temp[k++]=v;}int main(){//freopen("a.txt","r",stdin);    int first_point, second_point, i, edge_num;    while(cin>> edge_num){        memset( edge,0,sizeof(edge));        memset(temp,0,sizeof(temp));        minn=505;        maxn=0;        k=0;        for(i =0; i < edge_num; i ++){             cin>>first_point>>second_point;             edge[first_point][second_point] ++;             edge[second_point][first_point] ++;             edge[first_point][0] ++;              edge[second_point][0] ++;              minn = min(minn,min(first_point,second_point)); maxn = max(maxn,max(first_point,second_point));        }        for(i = minn; i <= maxn; i ++)            if(edge[i][0]%2){                dfs(i);                break;            }        if(i==maxn+1)    dfs(1);        for(int j=k-1;j>=0;j--)             printf("%d\n",temp[j]);    }    return 0;}

0 0
原创粉丝点击