poj 2230 DFS

来源:互联网 发布:如何注册一个好的域名 编辑:程序博客网 时间:2024/06/04 23:33

传送门

题意:从1出发每条路正反走一遍后回到1点,输出路径。

思路:感觉就是一个DFS的过程,要想搜下去一个点和回来,那么之间这条路就是刚好走过正反各一次,而且从1深搜,最后也肯定回到1点。但是这里要标记访问过的点和边。如果下一个点未被访问过,那么直接搜下去即可;如果下一个点被访问过,但是之间的边未走过,那么就只是去了就回来,同时边被走过了;如果下一个点被访问过了,同时边也走过了,那么就不用理他了。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int m,n,fst[10005],next[100005],node[100005],en;bool vis[10005],p[100005];void add(int u,int v){    next[en]=fst[u];    fst[u]=en;    node[en]=v;    en++;}void dfs(int u){    vis[u]=1;    cout<<u<<endl;    for(int i=fst[u]; i!=-1; i=next[i])    {        int v=node[i];        if(!vis[v])        {            p[i]=p[i^1]=1;            dfs(v);            cout<<u<<endl;        }        else        {            if(p[i]==0)            {                cout<<v<<endl;                cout<<u<<endl;                p[i]=p[i^1]=1;            }        }    }}int main(){    int u,v;    en=0;    memset(fst,-1,sizeof(fst));    memset(vis,0,sizeof(vis));    memset(p,0,sizeof(p));    scanf("%d%d",&n,&m);    for(int i=0; i<m; i++)    {        scanf("%d%d",&u,&v);        add(u,v);        add(v,u);    }    dfs(1);    return 0;}


原创粉丝点击