您的位置:首页 > 其它

CCF 送货 (欧拉回路+字典序打印路径)

2016-10-31 19:25 405 查看
题意:通过题意很容易判断是一个判断欧拉回路并打印路径

注意点有判断欧拉回路时因为要保证走过所有结点,所以要考虑到孤点和孤边的情况,需要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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ccf 欧拉路径