这道题是神坑啊,花了我将近3个小时,本来敲的挺顺的,交上去就是wa,坑点真坑,原来是有的路口交叉点可以没有
路通向它,无语,没有路通向也可以叫交叉点。。。。以后一定得考虑多种情况,用了bfs(vector做的)和dfs判断
的是否连通,判断连通之后只需要再判断是否都有偶数个度就ok了,坑,真坑。
bfs代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<queue> using namespace std; vector<int>map[10005]; int d[10005]; int visit[10005]; int m,n; void bfs(int x) { queue<int>que; que.push(x); visit[x] = 1; while(!que.empty()) { int y = que.front(); que.pop(); for(int i=0; i<map[y].size(); i++) { if(!visit[map[y][i]]) { visit[map[y][i]] = 1; que.push(map[y][i]); } } } return; } int main() { int i,a,b; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0; i<n; i++) map[i].clear(); memset(visit,0,sizeof(visit)); memset(d,0,sizeof(d)); for(i=0; i<m; i++) { scanf("%d%d",&a,&b); d[a]++; d[b]++; map[a].push_back(b); map[b].push_back(a); } bfs(0); int flag = 0; for(i=0; i<n; i++) { if(d[i]!=0) if(!visit[i]||d[i]%2!=0) { flag = 1; break; } } if(m==0) flag = 1; if(flag) puts("Not Possible"); else puts("Possible"); } }
dfs代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<queue> int map[205][205]; int d[205]; int visit[205]; int m,n; void dfs(int x) { visit[x] = 1; for(int i=0; i<n; i++) { if(!visit[i]&&map[x][i]==1) { // map[x][i] = 0; dfs(i); } } return; } int main() { int i,a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); memset(d,0,sizeof(d)); for(i=0; i<m; i++) { scanf("%d%d",&a,&b); d[a]++; d[b]++; map[a][b] = map[b][a] = 1; } dfs(0); int flag = 0; for(i=0; i<n; i++) { if(d[i]!=0) if(!visit[i]||(d[i]%2==1)) { flag = 1; break; } } if (n==0){ flag=1; } if(flag) puts("Not Possible"); else puts("Possible"); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-20 11:16:23