欧拉路径 基础题 hiho第49周

题目链接: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;
}

 

你可能感兴趣的:(基础)