poj2230 贝茜巡逻

来源:互联网 发布:深圳冰川网络招聘 编辑:程序博客网 时间:2024/04/19 05:41
【问题描述】  

  FJ有 N 个农场,他们由 M 条双向道路连接。贝茜从农场出发巡逻。每条路必须由两个方向各走一遍,最后回到农场1。题目保证有这样的路径存在。
  请输出这样的路径。

【输入格式】

  第一行输入N和M,之后M行输入一条路径的两个端点。

【输出格式】

  输出经过的农场,一行一个(字典序最小的)。

【输入样例】

4 5
1 2
1 4
2 3
2 4
3 4

【输出样例】

1
2
1
4
2
3
2
4
3
4
1

【数据范围】

2<=N<=10000 , 1<=M<=50000

这道题直接把每条无向边看成两条有向边,存储2次找欧拉路径,值得注意的是这里没一个点的度都为偶数,所以直接从1开始就可以了。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>using namespace std;const int maxn=10005;struct shu{    int v,id;};vector<shu>a[maxn];int n,m,du[maxn];vector<int>d;int vis[100005];bool my(shu x,shu y){    return x.v<y.v;}void init(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        a[x].push_back((shu){y,i});        a[y].push_back((shu){x,i+m});    }    for(int i=1;i<=n;i++)    sort(a[i].begin(),a[i].end(),my);}void dfs(int i){    for(int j=0;j<a[i].size();j++)    {        if(vis[a[i][j].id]) continue;        int t=a[i][j].v;        vis[a[i][j].id]=1;        dfs(t);    }    d.push_back(i);}int main(){    memset(du,0,sizeof(du));    memset(vis,0,sizeof(vis));    init();    int s=1;    dfs(s);    for(int i=d.size()-1;i>=0;i--)    printf("%d\n",d[i]);    return 0;}
1 0
原创粉丝点击