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;
    }
    
  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/noblex/p/8012099.html
Copyright © 2011-2022 走看看