hdu3018(gcc)

无向图欧拉路问题  首先确定连通分量的个数,如果是连通分量,则为强连通分量,即分量中的任意两个顶点均可存在至少一条路径可以到达,其次确定每个连通分量的欧拉路问题,如果连通分量内所有顶点的度数均为偶数,则必然存在一条欧拉回路,满足条件,否则,存在偶数个度数为奇数的顶点,因为设某个连通分量含有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;
}

    
    
   
   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值