CCF_ 201512-4_送货

一道拖了很久了题,用bool开的vis不会爆内存,dfs回溯的话会超时,于是有了一个很巧妙的dfs。

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

bool vis[10005][10005] = {0};
int ans[100005],n,m,cnt = 0;
vector<int> v[10005];


void dfs(int x)
{
    for(int i = 0;i < v[x].size();i++)
    {
        if(vis[x][v[x][i]])   continue;
        vis[x][v[x][i]] = 1;
        vis[v[x][i]][x] = 1;
        dfs(v[x][i]);
        ans[++cnt] = v[x][i];
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(int i = 1;i <= n;i++)   sort(v[i].begin(),v[i].end());
    dfs(1);
    if(cnt == m)
    {
        printf("1");
        for(int i = cnt;i > 0;i--) printf(" %d",ans[i]);
        printf("\n");
    }
    else    printf("-1\n");
    return 0;
}

 

posted @ 2016-10-09 16:47  zzzzzzzzhu  阅读(370)  评论(3编辑  收藏  举报