zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    数据库基本设计
    servlet 高级知识之Listener
    servlet 高级知识之Filter
    servlet-生命周期
    http协议概述
    javase高级技术
    javase高级技术
    IO之4种字节流拷贝文件方式对比
    Map 概述
    图解 数组,链表,2种数据结构
  • 原文地址:https://www.cnblogs.com/noblex/p/8012099.html
Copyright © 2011-2022 走看看