SGU101 Domino
来源:互联网 发布:软件测试策略 编辑:程序博客网 时间:2024/05/16 19:36
题目大意:N(N<=100)张骨牌,每张骨牌的两端有数字0-6。问能否将其连成一条直线,使得前一张骨牌的右端与后一张骨牌的左端数字是相同的。允许通过旋转将骨牌的左右两端数字进行交换。
欧拉回路、欧拉路存在的判定:
1、欧拉路:
无向图:连通。度数为奇数的顶点个数为0或2。
有向图:基图连通。所有顶点的入度等于出度,或者有且仅有一个顶点入度-出度=1,有且仅有一个顶点出度-入度=1。
2、欧拉回路:
无向图:连通。度数为奇数的顶点个数为0。
有向图:基图连通。所有顶点的入度等于出度。
该题属于无向图求欧拉路。
#include<stdio.h>#include<vector>#include<cstring>using namespace std;struct Edge{ int u,v; bool vis;};Edge edge[105];int deg[7];vector<pair<int,char> >ans;vector<int> a[7];void dfs(int u){ int i,j; for(i=0;i<a[u].size();++i) { j=a[u][i]; if(!edge[j].vis) { edge[j].vis=1; if(edge[j].u==u) { dfs(edge[j].v); ans.push_back(make_pair(j+1,'+')); } else { dfs(edge[j].u); ans.push_back(make_pair(j+1,'-')); } } }}int main(){ int i,n; scanf("%d",&n); memset(deg,0,sizeof(deg)); for(i=0;i<n;++i) { scanf("%d%d",&edge[i].u,&edge[i].v); edge[i].vis=0; deg[edge[i].u]++,deg[edge[i].v]++; a[edge[i].u].push_back(i); a[edge[i].v].push_back(i); } int s=0,start; for(i=0;i<7;++i) if(deg[i]&1) {start=i;++s;} //求奇度顶点个数 if(s==0||s==2) { ans.clear(); for(i=0;i<7;++i) if(deg[i]) start=i; for(i=0;i<7;++i) if(deg[i]&1) start=i; dfs(start); if(ans.size()<n) puts("No solution"); else { for(i=ans.size()-1;i>=0;--i) printf("%d %c\n",ans[i].first,ans[i].second); } } else puts("No solution"); return 0;}
0 0
- SGU101 Domino
- sgu101:Domino
- SGU101 Domino
- SGU101 Domino
- sgu101: Domino
- SGU101 Domino
- SGU101 - Domino(欧拉路)
- SGU101 Domino 留坑
- SGU101 Domino(欧拉回路)
- SGU101
- Sgu101
- sgu101
- SGU101 DFS
- SGU101----110
- SGU101欧拉回路
- sgu101-欧拉回路
- domino
- Domino
- C++ 类的析构函数学习笔记7
- Spring Resources接口
- 使用svn与eclipse管理本地代码
- Adding iAd in your App from Unity3d
- Android 开发 shareSDK 分享的时候 如何设置 登录和分享走客户端?
- SGU101 Domino
- HDU 1070 Milk
- Mysql与Oracle的区别
- 【OpenCV】颜色空间RGB与HSV(HSL)的转换
- Android学习总结六:ArrayList动态数组、Foreach syntax
- Gradle脚本基础
- 笔记:java中的抽象方法特点
- ubuntu 14.04 64bit 安装32位支持
- Dijkstra 算法寻找最短路径 较简易