码迷,mamicode.com
首页 > 其他好文 > 详细

Watchcow

时间:2016-05-21 11:30:13      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

传送门

题目大意:

给你一幅连通的图,要求从起点1开始走,要经过每条边刚好两次,并且最终回到1起点。

思路:将无向图转换成有向图求欧拉回路。

#include<cstdio>
#define N 11000
#define M 110000//由于是将无向图转换成有向图,所以边变为原来的两倍。
               //因此*2,这个地方调了好几天,满满的都是泪啊。 
int n,m; 
struct map
{
    int tot;
    int head[N],v[M],pre[M];
    /*
      pre[]里存的是a点连得另一个点的编号。 
      v[]存的是当前边连得b点。 
    */ 
    bool f[M];
    void addedge(int a,int b)
    {
        tot++;
        v[tot]=b;
        pre[tot]=head[a];
        head[a]=tot;
    }
}G;
void dfs(int now)
{
    for (int p=G.head[now];p;p=G.pre[p])
      {
           if (!G.f[p])
             {
              G.f[p]=1;
              dfs(G.v[p]);                 
           }
      } 
      printf("%d\n",now);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
      {
          int a,b;
          scanf("%d%d",&a,&b);
          G.addedge(a,b);
          G.addedge(b,a);
      }
    dfs(1);
    return 0;
}

 

Watchcow

标签:

原文地址:http://www.cnblogs.com/sjymj/p/5514151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!