hihoCoder - 1176 - 欧拉路·一 (欧拉路的判定)

#1176 : 欧拉路·一

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏。现在他们控制的角色来到了一个很大的湖边。湖上有N个小岛(编号1..N),以及连接小岛的M座木桥。每座木桥上各有一个宝箱,里面似乎装着什么道具。

湖边还有一个船夫,船夫告诉主角。他可以载着主角到任意一个岛上,并且可以从任意一个岛上再载着主角回到湖边,但是主角只有一次来回的机会。同时船夫告诉主角,连接岛屿之间的木桥很脆弱,走过一次之后就会断掉。

因为不知道宝箱内有什么道具,小Hi和小Ho觉得如果能把所有的道具收集齐肯定是最好的,那么对于当前岛屿和木桥的情况,能否将所有道具收集齐呢?

举个例子,比如一个由6个小岛和8座桥组成的地图:

主角可以先到达4号小岛,然后按照4->1->2->4->5->6->3->2->5的顺序到达5号小岛,然后船夫到5号小岛将主角接回湖边。这样主角就将所有桥上的道具都收集齐了。

提示:欧拉路的判定

输入

第1行:2个正整数,N,M。分别表示岛屿数量和木桥数量。1≤N≤10,000,1≤M≤50,000

第2..M+1行:每行2个整数,u,v。表示有一座木桥连接着编号为u和编号为v的岛屿,两个岛之间可能有多座桥。1≤u,v≤N

输出

第1行:1个字符串,如果能收集齐所有的道具输出“Full”,否则输出”Part”。

样例输入
6 8
1 2
1 4
2 4
2 5
2 3
3 6
4 5
5 6
样例输出
Full

欧拉路的判定:一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点。

简洁来说就是判断出入度+并查集判断连通分量个数。

AC代码:

#include <map>
#include <set>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <cctype>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
using namespace std;

int n, m;

const int maxn = 10005;
vector<int> G[maxn];

int pa[maxn];
int deg[maxn];
int vis[maxn];

int find(int x) {
	return pa[x] == x ? x : pa[x] = find(pa[x]);
}

int main() {
	while(scanf("%d %d", &n, &m) != EOF) {
		memset(vis, 0, sizeof(vis));
		for(int i = 0; i <= n; i ++) {
			pa[i] = i;
		}
		for(int i = 0; i < m; i ++) {
			int u, v;
			scanf("%d %d", &u, &v);
			int fu = find(u);
			int fv = find(v);
			if(fu != fv) pa[fu] = fv;
			deg[u] ++;
			deg[v] ++;
		}

		int flag = 1;
		//判断有多少个点的度数为奇数
		int cnt = 0;
		for(int i = 1; i <= n; i ++) {
			if(deg[i] & 1) {
				cnt ++;
			}
		}
		if(!(cnt == 0 || cnt == 2)) {
			flag = 0;
		}
		//并查集判断连通分量
		cnt = 0;
		for(int i = 1; i <= n; i ++) {
			int f = find(i);
			if(!vis[f]) {
				cnt ++;
				vis[f] = 1;
			}
		}
		if(cnt != 1) flag = 0;

		if(flag == 1) {
			printf("Full\n");
		}
		else {
			printf("Part\n");
		}
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 14:43:04

hihoCoder - 1176 - 欧拉路·一 (欧拉路的判定)的相关文章

hihocoder 1176

hihocoder 1176 题意:N,M.分别表示岛屿数量和木桥数量,一笔画 分析:欧拉路问题(给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路) 欧拉路的条件 一个无向图存在欧拉路当且仅当该图是连通 且只有2个点的度数是奇数(此时这两个点只能作为欧拉路径的起点和终点 用并查集判断第一个条件 第二个直接用数组存 1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #i

hihoCoder #1176 : 欧拉路&#183;一 (简单)

题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度数为偶数. 2.连通图,其中两个岛的度比为奇数. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=10005; 4 vector< vector<int> > vect; 5 bool vis[

[hihoCoder] 第五十周: 欧拉路&#183;二

题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. ——By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现主角

【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行的了. 首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久..) 推论(一): phi(p^k)=(p-1)*p^(k-1) 证明: 令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个. 1~n出去p的倍数,所以phi(n)= n -  p^

【bzoj4804】欧拉心算 欧拉函数

题目描述 给出一个数字N 输入 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10^7 输出 按读入顺序输出答案. 样例输入 1 10 样例输出 136 题解 欧拉函数 其中用到了 这个推导很简单:由欧拉函数的定义,$\sum\limits_{i=1}^k\sum\limits_{j=1}^i[\gcd(i,j)=1]=\sum\limits_{i=1}^k\varphi(i)$,此时$i\ge j$,而当$i\le j$时情况相同.最后

欧拉筛 + 欧拉函数

1 /** 2 * Fuck you. 3 * I love you too. 4 */ 5 #include<bits/stdc++.h> 6 #define lson i<<2 7 #define rson i<<2|1 8 #define LS l,mid,lson 9 #define RS mid+1,r,rson 10 #define mem(a,x) memset(a,x,sizeof(a)) 11 #define gcd(a,b) __gcd(a,b) 1

线性(欧拉)筛&amp;欧拉函数

线性筛法 what is 线性筛??就是基于最基本的筛法的优化. 在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算. 我们的做法就是让每一个数的最小因数筛. \(FOR\) \(EXAMPLE:\) 有一个数\(2 * 2 * 3 * 5\) 有另一个数 \(3 * 3 * 3* 5\) 那么第一个数枚举到3的话,筛到的数字是\(2 * 2 * 3 * 3 * 5\) 但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到\(2 * 2 * 3 *

欧拉函数 欧拉筛法

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示.特殊的,φ(1)=1. 若p是质数,显然有φ(p)=p-1. 计算公式:φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn) 欧拉函数是积性函数,但不是完全积性函数.即当且仅当x和y互质时,有phi(x,y)=phi(x)*phi(y),证明显然. 欧拉函数的一些性质: n为奇数时,φ(2n)=φ(n) 若p为质数,n=p^k,则φ(n)=p^k-p^(k-1) n>2时,φ(n)一定为偶数 小于n的数中,与n

图的路径:欧拉路(欧拉回路)

欧拉路的相关概念: 1.能从无向图中的一个顶点出发,并走出一条道路,每条边恰好经过一次,这样的路线就叫做欧拉路: 2.找欧拉路首先要判断是否存在欧拉路: 一个无向图存在欧拉路当且仅当该图是连通的,且有且只有0或2个点的度数是奇数,为2时这两个点只能作为欧拉路径的起点和终点(0个时称为欧拉回路). 3.确定存在欧拉路之后,开始构造欧拉路: 欧拉路参考:http://blog.csdn.net/shahdza/article/details/6630108 等做完题,再来补充.