您的位置:首页 > 其它

判断图的连通性+一笔画问题(NYOJ 42 一笔画问题)

2014-11-24 23:26 405 查看
我感觉判断图的连通性可以用BFS,也可以用DFS,但是感觉DFS快些(没试过BFS),所以只写了DFS。。

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<cmath>

#include<algorithm>

#include<queue>

#include<time.h>

using namespace std;

int s[1100][1100],v[1100],c[1100];//s表示图的连线情况,v表示点是否可联通,c表示点的度

int ans,q,p,sum;

void dfs(int d)

{

if(sum==p)

{

ans=1;

}

else

{

int i;

for(i=1;i<=p;i++)

{

if(s[d][i]==0&&v[i]==0)

{

v[i]=1;

sum++;

dfs(i);

}

}

}

}

int main()

{

int t,i,j,a,b,ou,ji;

cin>>t;

while(t--)

{

cin>>p>>q;

memset(s,-1,sizeof(s));

memset(c,0,sizeof(c));

for(i=0;i<q;i++)

{

scanf("%d%d",&a,&b);

c[a]++;

c[b]++;

s[a][b]=0;

s[b][a]=0;

}

ans=0;

sum=1;

memset(v,0,sizeof(v));

v[1]=1;

dfs(1);

if(ans==0)

{

cout<<"No"<<endl;

}

else

{

ou=ji=0;//判断是否可以一笔画:点的度全是偶数或者奇数度的点只有两个就行,其他都不行(有偶数个奇点除以2可以算出需要几画)

for(i=1;i<=p;i++)

{

if(c[i]%2==0)

{

ou++;

}

else

{

ji++;

}

}

if(ji==0||ji==2)

{

cout<<"Yes"<<endl;

}

else

{

cout<<"No"<<endl;

}

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: