【UVa】12118 Inspector's Dilemma(欧拉道路)

题目

题目
 


分析

很巧秒的一道题目,对着绿书瞎yy一会。
联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2。这样不断相加的和加上e再乘以t就是答案,
为什么呢?题目要求最短距离,那么必定是欧拉道路,那么为了构造出最短欧拉道路,要将奇度数的点减小至2个,然而各个道路不一定联通,还需要计算一下联通块数量n,结果加上n-1后,再乘t,因为需要n-1条边将各个联通块连接起来。
注意题目已保证每两个点都有路,所以上面才能那么肆无忌惮的连边。
 


代码

#include <bits/stdc++.h>
using namespace std;
vector<int> G[1005];
int vis[1005];
int dfs(int u)
{
	if(vis[u]) return 0; vis[u]=1;
	int r=G[u].size()%2;
	for(int i=0;i<G[u].size();i++)
		r+=dfs(G[u][i]);
	return r;
}
int main()
{
	int v,e,t,kase=0;
	while(scanf("%d%d%d",&v,&e,&t)==3 && (v||e||t))
	{
		kase++;
		for(int i=0;i<=v;i++) G[i].clear();
		memset(vis,0,sizeof(vis));
		for(int i=0;i<e;i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			G[a].push_back(b); G[b].push_back(a);
		}
		int res=0,n=0;
		for(int i=1;i<=v;i++)
		{
			if(vis[i] || G[i].empty()) continue;
			res+=max(0,(dfs(i)-2)/2);
			n++;
		}
		printf("Case %d: %d
",kase,t*(res+max(0,n-1))+e*t);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/noblex/p/8012099.html