这个题也卡卡卡,发现自己好粗心,唉.。
有向图的判定:
统计每个点的出度和入度,
前提是有向图是连通图。
1. 如果每个点的出度 = 入度 则存在欧拉回路。
2. 如果有且仅有两点出度、入度不想等,且这两个点的出度 - 入度差为1 或 -1.差为1的那个点是欧拉图的起点,为 -1 的是重点。
这个题先来判断图的连通性,用并查集的方法,值得注意的一点是并查集是以点为元素的,所以要开26长度的数组。
在接下来就是判断出度和入度了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
const int MAXN = 1e5 + 10;
int father[30];
int _rank[30];
int d1[30]; // 出度
int d2[30]; // 入度
bool h[MAXN]; // 判断是否出现边中
void init()
{
for(int i = 1;i <= 26;++i)
{
father[i] = i;
_rank[i] = 0;
}