标签:
题目链接:hiho 第49周
思路:
定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路。
性质:
1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点。
2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路
利用性质做题就好了,具体的模拟hiho讲的非常清楚了
/************************************************************** Problem:hiho 49 User: youmi Language: C++ Result: Accepted Time:16ms Memory:1MB ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <sstream> #include <cmath> #include <queue> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define pt(a) printf("%d\n",a) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; int n,m; const int maxn=10000+10; const int maxm=50000+10; int head[maxn],deg[maxn]; struct side { int v,next; }e[maxm<<1]; int T; void build(int u,int v) { e[T].v=v; e[T].next=head[u]; head[u]=T++; } bool vis[maxn]; int cnt; void dfs(int u)//判断是否联通 { vis[u]=1; cnt++; for(int i=head[u];~i;i=e[i].next) { int v=e[i].v; if(!vis[v]) { dfs(v); } } } int main() { //freopen("in.txt","r",stdin); while(~sc2(n,m)) { int u,v; zeros(deg); ones(head); T=0; rep0(i,m) { sc2(u,v); deg[u]++; deg[v]++; build(u,v); build(v,u); } int tot=0; for(int i=1;i<=n;i++) { if(deg[i]%2) tot++; } cnt=0; zeros(vis); dfs(1); if((tot==2||tot==0)&&cnt==n) printf("Full\n"); else printf("Part\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/youmi/p/4603478.html