列表

详情


NC50422. Ant Trip

描述

给你无向图的N个点和M条边,保证这M条边都不同且不会存在同一点的自环边,现在问你至少要几笔才能所有边都画一遍。(一笔画的时候笔不离开纸)

输入描述

多组数据,每组数据用空行隔开。
对于每组数据,第一行两个整数N,M表示点数和边数。接下去M行每行两个整数a,b,表示a,b之间有一条边。

输出描述

对于每组数据,输出答案。

示例1

输入:

3 3
1 2
2 3
1 3

4 2
1 2
3 4

输出:

1
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 134ms, 内存消耗: 1532K, 提交时间: 2020-05-30 10:59:54

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+1;
int p[MAXN];
int find(int x)
{
	return p[x]=p[x]==x?x:find(p[x]);
}
void init()
{
	for(int i=0;i<MAXN;i++)
	p[i]=i;
}
int main()
{
	int N,M;
	while(cin>>N>>M)
	{
		vector<bool> exist(N+1);
		vector<int> deg(N+1);
		init();
		while(M--)
		{
			int u,v;
			cin>>u>>v;
			exist[u]=exist[v]=true;
			deg[u]++,deg[v]++;
			int pu=find(u),pv=find(v);
			if(pu!=pv) p[pu]=pv;
		}
		vector<int> cnt(N+1);
		for(int i=1;i<=N;i++)
		if(exist[i])
		{
			if(deg[i]%2) cnt[find(i)]++;
		}
		int tot=0;
		for(int i=1;i<=N;i++)
		if(exist[i]&&i==find(i))
		{
			if(cnt[i]==0) tot++;
			else tot+=cnt[i]/2;
		}
		cout<<tot<<endl;
	}
}

上一题