您的位置:首页 > 其它

NYOJ 42 一笔画问题

2016-07-19 11:53 337 查看
题目传送门

欧拉路径和欧拉回路

欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径。

欧拉回路:在欧拉路径的基础上又回到起点。

a、凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为

终点画完此图。   

b、凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另

一个奇点终点。  

c、其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。)

欧拉回路和欧拉路径的判断

欧拉回路:

无向图:每个顶点的度数都是偶数,则存在欧拉回路。

有向图:每个顶点的入度都等于出度,则存在欧拉回路。

欧拉路径:

无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。

有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其

他顶点 出度=入度。

思路:

这里能一笔画有两个条件。

图连通,度为奇数的点的个数为0或者2.

这里用邻接表表示的图。

GG

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int MAXN=1005;
vector<int>v[MAXN];
int F[MAXN];
int T,n,m;
int a,b;
int find(int x){
return F[x]==x?x:F[x]=find(F[x]);
}

int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)F[i]=i;
memset(v,0,sizeof(v));
while(m--){
scanf("%d%d",&a,&b);
v[a].push_back(b);//双向边
v[b].push_back(a);
int u=find(a),v=find(b);
if(u!=v)F[u]=v;//合并
}
int cnt=0;
int k=0;
for(int i=1;i<=n;i++){
if(find(i)==i)cnt++;
if(v[i].size()%2)k++;//奇数的度的点
}
if((k==0||k==2)&&cnt==1)printf("Yes\n");//k为0或2,根只有一个。
else printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: