CCF 送货

来源:互联网 发布:c语言temp怎么交换位置 编辑:程序博客网 时间:2024/04/30 04:27

题意:通过题意很容易判断是一个判断欧拉回路并打印路径

注意点有判断欧拉回路时因为要保证走过所有结点,所以要考虑到孤点和孤边的情况,需要dfs1判断;再就是因为要求最小字典序打印,所以要在打印路径时对存边的vector排序一下即可

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<vector>#include<map>using namespace std;const int maxn = 10000+7;int n,m;int d[maxn],cp[maxn];bool vis[maxn][maxn];vector<int> road;vector<int> g[maxn];void dfs(int u){    int vs = g[u].size();    for(int i=0; i<vs; i++)    {        int v = g[u][i];        if(!vis[u][v])        {            vis[u][v] = vis[v][u] = 1;            dfs(v);            road.push_back(v);        }    }}void dfs1(int a){    cp[a]=1;    vector<int>::iterator it;    for(it=g[a].begin();it!=g[a].end();it++)    {        if(!cp[*it])        {            dfs1(*it);        }    }}int main(){    scanf("%d%d",&n,&m);    memset(d,0,sizeof(d));    memset(vis,0,sizeof(vis));    memset(cp,0,sizeof(cp));    for(int i=0; i<m; i++)    {        int u,v;        scanf("%d%d",&u,&v);        d[u]++, d[v]++;        g[u].push_back(v);        g[v].push_back(u);    }    bool flag = false;    int f = 0;    dfs1(1);    for(int i=1; i<=n; i++)    {        if(d[i]%2 == 1) f++;        if(d[i] == 0) flag = true;        if(cp[i] == 0) flag = true;    }    if(f == 2 && d[1]%2 == 0)    {        printf("-1\n");        return 0;    }    if(flag)    {        printf("-1\n");        return 0;    }    if(f == 0 || f == 2)    {        for(int i=1; i<=n; i++)        {            sort(g[i].begin(),g[i].end());        }        dfs(1);        printf("1");        int vs = road.size();        for(int i=vs-1; i>=0; i--)            printf(" %d",road[i]);    }    else printf("-1\n");    return 0;}


0 0
原创粉丝点击