zyc從小就比較喜歡玩一些小游戲,其中就包括畫一筆畫,他想請你幫他寫一個程序,判斷一個圖是否能夠用一筆畫下來。
規定,所有的邊都只能畫一次,不能重復畫。
2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4
No Yes
思路:1、判斷聯通,用dfs或並查集都行
2、奇點個數為0或奇點個數為2,則可以一筆,否則需count/2筆
代碼:
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
vector<int>mp[1005];
int vis[1005];
int num;
void dfs(int x)
{
vis[x]=1;
num++;
for(int i=0;i<mp[x].size();i++)
{
int v=mp[x][i];
if(!vis[v])
dfs(v);
}
}
int main()
{ int n,m,k;
cin>>n;
while(n--)
{
cin>>m>>k;
for(int i=0;i<=m;i++)
if(mp[i].size())
mp[i].clear();
int a,b;
for(int i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
mp[a].push_back(b);
mp[b].push_back(a);
}
num=0;
int t=0;
for(int i=1;i<=m;i++)
if(mp[i].size()%2)
t++;
memset(vis,0,sizeof(vis));
dfs(b);
if(num==m&&(t==0||t==2))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}