欧拉回路 + 数据结构 + dfs

来源:互联网 发布:sniffer捕获别人的数据 编辑:程序博客网 时间:2024/06/08 19:02

poj 2230

这个题确实很经典。刚开始的时候想了好久,一直没想明白怎么去遍历所有的点两遍。搜了,别人的解题报告。顿悟,标记边啊。太弱了。。然后保存成动态邻接表的形式。深搜一遍就过了。。后来看到一大牛博客上的解法,瞬间,觉得,那种相对邻接表保存的数据结构,简直碉堡了,神牛果然是用来学习的。。

邻接表:

#include <iostream>#include <vector>#include <cstdio>#define N 100005using namespace std;int n,m;struct node{    int v,f;};vector<node> g[N];void dfs(int k){    for(int i=0 ;i<g[k].size() ; i++)    {        if(g[k][i].f)        {            g[k][i].f=0;            dfs(g[k][i].v);        }    }    printf("%d\n",k);}int main (){    int i;    //freopen("1.txt","r",stdin);    while(scanf("%d%d",&n,&m)!=EOF)    {        int x,y;        for(i=0 ; i<m ; i++)        {            node t;            scanf("%d%d",&x,&y);            //x->y            t.v=y,t.f=1;            g[x].push_back(t);            //y->x            t.v=x,t.f=1;            g[y].push_back(t);        }        dfs(1);    }    return 0;}


大牛的强势保存形式:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#define N 100005using namespace std;bool f[N];struct node{    int t,nx;}e[N];int n,m,a[N],nt;void dfs(int k){    int v;    for(v=a[k] ; v!=-1 ; v=e[v].nx)    {        if(!f[v])        {            f[v]=1,dfs(e[v].t);        }    }    printf("%d\n",k);}int main (){    //freopen("1.txt","r",stdin);    while(scanf("%d%d",&n,&m)!=EOF)    {        int i,x,y;        memset(f,0,sizeof(f));        memset(a,-1,sizeof(a));        for(nt=i=0 ; i<m ; i++)        {            scanf("%d%d",&x,&y);            //x->y            e[nt].t=y,e[nt].nx=a[x],a[x]=nt++;            //y->x            e[nt].t=x,e[nt].nx=a[y],a[y]=nt++;        }        dfs(1);    }    return 0;}
btw:要理解 后面那段代码的保存结构,建议自己画图。 (个人以最近孩子的概念,每个节点保存了 ta上一个兄弟节点的信息。。)


原创粉丝点击