hdu3018 Ant Trip

本文探讨了在无向图中使用一笔画的算法解决路径问题,通过寻找连通分量并计算奇度点数量来确定所需笔画次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        题意:拓展一笔画问题。给一个无向图,每条边只能经过一次,问多少笔能将图画完。孤立的点不用考虑。

        思路:先把每个连通分量找出来,然后数这个连通分量的度为奇数的点,如果该连通分量是欧拉通路,显然可以一笔画,否则需要次数是奇度点数量/2。


#include <iostream>             
#include <stdio.h>             
#include <cmath>             
#include <algorithm>             
#include <iomanip>             
#include <cstdlib>             
#include <string>             
#include <memory.h>             
#include <vector>             
#include <queue>             
#include <stack>             
#include <map>           
#include <set>           
#include <ctype.h>
#define ll long long         
#define max3(a,b,c) max(a,max(b,c)) 
using namespace std;    


vector<int> mp[100010];
int deg[100010];

int p[100010];//标记连通分量 
int odd[100010];


int main(){
	int n,m;
	while(cin>>n>>m){
		//init
		memset(p,-1,sizeof(p));
		memset(mp,0,sizeof(mp));
		memset(deg,0,sizeof(deg));
		memset(odd,0,sizeof(odd));
		//
		for(int i=1;i<=m;i++){
			int u,v;
			scanf("%d%d",&u,&v);
			deg[u]++; deg[v]++;
			mp[u].push_back(v);
			mp[v].push_back(u);
		}
		
		int cnt=0;
		for(int i=1;i<=n;i++){
			
			if(p[i]==-1){
				if(!deg[i])continue;//无视孤立的点 
				cnt++;
				p[i]=cnt;
				
			}else{
				continue;
			}
			queue<int> que; que.push(i);
			while(!que.empty()){
				int cur=que.front(); que.pop();
				int siz=mp[cur].size();
				for(int j=0;j<siz;j++){
					int v=mp[cur][j];
					if(p[v]!=-1)continue;
					que.push(v);
					p[v]=cnt;
				}
			}
		}
		
		for(int i=1;i<=n;i++){
			if(deg[i]&1){
				odd[p[i]]++;
			}
		}
		int ans=0;
		for(int i=1;i<=cnt;i++){
			ans+=max(1,(odd[i]/2));
		}
		cout<<ans<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值