PAT (Advanced Level) Practice A1126 Eulerian Path (25 分)(C++)(甲級)(無向圖、BFS、度)

原題鏈接

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
using namespace std;

typedef long long int LL;
const int MAX = 510, INF = 1<<30;

int N, M, A, B;
vector<int> G[MAX];
bool visited[MAX] = {0};
int cnt = 0;

bool BFS(int v)//用BFS判斷圖是否連通
{
    queue<int> Q;
    Q.push(v);
    visited[v] = 1;
    int num = 0;
    while(!Q.empty())
    {
        v = Q.front();
        Q.pop();
        num++;
        for(int i=0; i<(int)G[v].size(); i++)
        {
            if(!visited[G[v][i]])
            {
                Q.push(G[v][i]);
                visited[G[v][i]] = 1;
            }
        }
    }
    if(num == N) return true;
    return false;
}


int main()
{
    scanf("%d %d", &N, &M);
    for(int i=0; i<M; i++)
    {
        scanf("%d %d", &A, &B);
        G[A].push_back(B);
        G[B].push_back(A);
    }
    for(int i=1, flag=0; i<=N; i++)
    {
        if(flag) printf(" ");
        flag = 1;
        printf("%d", G[i].size());//可能有的頂點度爲0,同樣也要輸出0
        if(G[i].size()%2) cnt++;
    }
    printf("\n");
    if(N && !BFS(1)) printf("Non-Eulerian");//不連通的情況
    else if(cnt == 0) printf("Eulerian");
    else if(cnt == 2) printf("Semi-Eulerian");
    else printf("Non-Eulerian");
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章