zoj 1395 && poj 1300 Door Man
2015-03-16 15:15
435 查看
题意:从自己的房间出发经过所有的房间,最后回到0号房间。通过后的门会立即关上,关上的门不再打开。
分析:首先根据给定的条件建图,若从0号房间出发,那么我们便是判断欧拉回路是否存在;若从其他房间出发,那么我们就是判断是否存在欧拉通路。
无向图的欧拉回路判定:一个图为无奇度结点的联通图。
无向图欧拉通路的判定:图为联通图,并且仅有两个奇度节点,而且欧拉通路必以这两个结点为端点。
代码:
分析:首先根据给定的条件建图,若从0号房间出发,那么我们便是判断欧拉回路是否存在;若从其他房间出发,那么我们就是判断是否存在欧拉通路。
无向图的欧拉回路判定:一个图为无奇度结点的联通图。
无向图欧拉通路的判定:图为联通图,并且仅有两个奇度节点,而且欧拉通路必以这两个结点为端点。
代码:
#include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <string> using namespace std; int d[30]; int main(){ string op; while(1){ cin>>op; if(op == "ENDOFINPUT") break; if(op[0] == 'S'){ int door_man,vex_cnt; string arc; memset(d,0,sizeof(d)); cin>>door_man>>vex_cnt; getchar(); int arc_cnt = 0; for(int i = 0; i < vex_cnt; i++){ getline(cin,arc); istringstream is(arc); int value; while(is>>value){ arc_cnt++; d[i]++; d[value]++; } } int odd_cnt = 0; for(int i = 0; i < vex_cnt; i++) if(d[i] & 1) odd_cnt++; int flag = 0; if(door_man == 0 && odd_cnt == 0) flag = 1; else if(door_man != 0){ if(d[door_man] & 1){ if(odd_cnt == 2) flag = 1; } } if(flag){ printf("YES %d\n",arc_cnt); } else{ printf("NO\n"); } } cin>>op;//读入END } return 0; }
相关文章推荐
- zoj 1333 && poj 1545 Galactic Import(floyd)
- zoj 1951 || poj 2262 Goldbach's Conjecture(水水~)
- poj 1032 && zoj 1265 Area
- poj 1014 & zoj 1149 Dividing(多重背包+倍增思想优化)
- poj 1384 & zoj 2014 Piggy-Bank(完全背包)
- ZOJ 1133 Smith Numbers && POJ 1142 Smith Numbers
- poj 1222 & zoj 1354 EXTENDED LIGHTS OUT (枚举)
- poj 3067 && zoj 3129
- ZOJ 1857 && POJ 2607 Fire Station【SPFA】
- poj 1564 && zoj 1711 Sum It Up (dfs)
- ZOJ 1161 && POJ 1042
- zoj 1377 || poj 1228 Grandpa's Estate
- ZOJ 1066 Square Ice(POJ 1099)(找规律&模拟)
- poj 2029 && zoj 1716 Get Many Persimmon Trees
- JOJ 1089 & ZOJ 1060 & poj 1094 Sorting It All Out (邻接表的栈拓扑排序模板)
- ZOJ 1395 Door Man
- POJ 3660 && NYIST 211 Cow Contest && ZOJ 1060 Sorting It All Out【Floyd算法扩展应用】
- poj 3268 Silver Cow Party & zoj 2008 Invitation Cards
- zoj 1031& poj 1084 (Dancing Links 重复覆盖)
- POJ-1625 & ZOJ-1540 & Ural-1158 AC自动机+DP+大数..