USACO/fence 3.3.1 欧拉回路

来源:互联网 发布:斑马斑马 知乎 编辑:程序博客网 时间:2024/06/11 01:48

这个题我刚开始没有考虑有环的情况,用了个自以为简单的方法,然后一直错了

代码如下。

#include<stdio.h>#include<stdlib.h>int total[510][510]={0};int min=1000,max=0;int ans[3000]={0},f=0;int sum=0;/*=========================每个结点从小到大dfs当其没有其它结点时将其放在输出数组里===========================*/void dfs(int n,int m){    int i ,j;    if(sum==m) return;                                      //访问的边的条数等于m,结束    for(i=min;i<=max;i++)    if(total[n][i])    {        total[n][i]--;                                               //两者边的条数减1        total[i][n]--;        sum++;                                                       //边的条数加1        dfs(i,m);        ans[f++]=i;    }}/*===============================主要了解欧拉回路的性质,当结点度数全部为偶数时可以从任一结点开始,但只有奇数时只能从奇数开始,奇数结束。==============================*/int main(){    FILE *fin=fopen("fence.in","r");    FILE *fout=fopen("fence.out","w");    int edge[510]={0};    int num;    int i ,j,x,y;    int start;    fscanf(fin,"%d",&num);    for(i=0;i<num;i++)    {        fscanf(fin,"%d %d",&x,&y);        edge[x]++;edge[y]++;        total[x][y]++;        total[y][x]++;        min=min<x?min:x;        min=min<y?min:y;        max=max>x?max:x;        max=max>y?max:y;    }    start=min;    for(i=min;i<=max;i++)    {        if(edge[i]%2)        {            start=i;            break;        }    }    dfs(start,num);    ans[f]=start;    for(i=f;i>=0;i--)    {        fprintf(fout,"%d\n",ans[i]);    }    return 0;}



原创粉丝点击