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
- ccf 送货
- ccf 送货
- ccf送货
- ccf 送货
- CCF 送货
- CCF送货
- CCF 送货
- CCF认证 送货
- CCF 201512-4 送货
- ccf 201512-4 送货
- CCF送货(欧拉图)
- CCF 201512-4 送货
- 【CCF 送货 waing】
- 201512-4 送货 ccf
- ccf 201512-4送货
- CCF之送货(java)
- ccf认证送货20分
- CCF-201512-4 送货(欧拉路径)
- 显示礼物
- 16.10.29 提高C组总结
- 正则化方法:防止过拟合,提高泛化能力
- python Anaconda2安装OpenCV2
- sql与hql的区别
- CCF 送货
- 程序改错
- 冒泡排序
- Linux学习之 嵌入式数据库
- laravel中的数据循环输出
- EOJ 2562
- 查看 linux 系统硬件配置
- Cocos2d-x在ios模拟器上前后台切换的方法调用
- 2016/10/30