无向图欧拉路问题 首先确定连通分量的个数,如果是连通分量,则为强连通分量,即分量中的任意两个顶点均可存在至少一条路径可以到达,其次确定每个连通分量的欧拉路问题,如果连通分量内所有顶点的度数均为偶数,则必然存在一条欧拉回路,满足条件,否则,存在偶数个度数为奇数的顶点,因为设某个连通分量含有x条路径,则所有顶点的度数和为2x,若含有奇数个顶点度数为奇数,显然不满足,则可以将度数为奇数的顶点配对,则存在一条欧拉路径,因此,对于含有度数为奇数顶点的连通分量,欧拉路径为(奇数顶点个数)/2,则最小group个数即为所有欧拉路径之和。
#include
#include
#define maxn 100001
int tree[maxn];
int graphic[maxn];
int degree[maxn];
int findRoot(int u){
if(tree[u] == -1) return u;
int v = findRoot(tree[u]);
tree[u] = v;
return v;
}
int main(){
int i, n, m;
while(scanf("%d%d", &n, &m) == 2){
int a, b, count = 0;
memset(tree, -1, sizeof(tree));
memset(graphic, 0, sizeof(graphic));
memset(degree, 0, sizeof(degree));
while(m--){
scanf("%d%d", &a, &b);
++degree[a];
++degree[b];
int p = findRoot(a);
int q = findRoot(b);
if(p != q) tree[p] = q;
}
for(i = 1; i <= n; ++i){
a = findRoot(i);
if(degree[i] % 2) ++graphic[a];
}
for(i = 1; i <= n; ++i)
if(tree[i] == -1)
if(degree[i])
if(graphic[i])
count += graphic[i] / 2;
else
++count;
printf("%d\n", count);
}
return 0;
}