UVA12118

该博客详细介绍了如何解决UVA12118问题,涉及图论中的欧拉道路概念。通过深度优先搜索(DFS)遍历每个连通块,计算奇点数量和没有奇点的连通块数。计算公式为:E + max(odd/2 - 1 + s, 0),其中E为边的数量,odd为奇点总数,s为没有奇点的连通块数。博客提供了AC代码实现。" 71333844,5633035,蓝桥杯算法训练:最大乘积动态规划解析,"['动态规划', '算法', '数据结构', '蓝桥杯竞赛', '数值计算']
摘要由CSDN通过智能技术生成
欧拉道路的题。dfs对每个连通块记录奇点个数odd,同时记录下没有奇点的连通块的数目s,那么所有有奇点的连通块连成一整个的欧拉道路需要另外经过odd/2-1条边。同时加上这个大连通块与另外s个连通块之间连通需要的s条道路再加上原本需要经过的E条道路就是最终答案。比较坑的一点是E可能为0.。。。。所以这里odd/2-1+s有可能得到-1.。。所以最终我们的答案应该是E+max(odd/2-1+s,0)。AC代码如下
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
struct Edge
{
	int from,to;
        Edge();
	Edge(int f,int t): from(f),to(t){}
};
vector<Edge> edges;
vector<int> G[1001];
set<int> p;
int vis[1001];
int odd=0;
void add_edge(int u,int v)
{
	edges.push_back(Edge(u,v));
	int m=edges.size();
	G[u].push_back(m-1);
}

void dfs(int u)
{
	vis[u]=1;
	if((int)G[u].size()%2==1)
		odd++;
	for(int j=0;j<G[u].size();j++)
	{
		int v=edges[G[u][j]].to;
		if(!vis[v])
			dfs(v);
	}
}

int main()
{
	int V,E,T,cnt=0;
	while(scanf("%d %d %d", &V, &E, &am
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值