博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 1453 城市环路
阅读量:4331 次
发布时间:2019-06-06

本文共 1476 字,大约阅读时间需要 4 分钟。

 

题解:

n== m很容易可以知道这是个基环树

记录环的起点终点,跑dp。

dp还是挺简单的。

 

#include 
#include
#include
#include
#define N 1000007using namespace std;int n, x, y, p[N], head[N], tot;bool flag[N], flag1;double dp[N][2], k, ans;struct node { int to, nxt;} edge[N << 1];void add_edge(int u, int v) { edge[++tot].to = v, edge[tot].nxt = head[u], head[u] = tot; edge[++tot].to = u, edge[tot].nxt = head[v], head[v] = tot;}void dfs(int now, int fa) { dp[now][1] = p[now], dp[now][0] = 0; for(int i = head[now]; i; i = edge[i].nxt) if(edge[i].to != fa) { dfs(edge[i].to, now); dp[now][0] += max(dp[edge[i].to][0], dp[edge[i].to][1]); dp[now][1] += dp[edge[i].to][0]; }}int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &p[i]); for(int i = 1, u, v; i <= n; ++i) { scanf("%d%d", &u, &v); u = u + 1, v = v + 1; if(!flag1 && flag[u] && flag[v]) { flag1 = 1, x = u, y = v; continue; } flag[u] = flag[v] = 1; add_edge(u, v); } scanf("%lf", &k); dfs(x, x); ans = dp[x][0];// for(int i = 1; i <= n; i++) printf("%.1lf %.1lf\n ", dp[i][1], dp[i][0]); dfs(y, y); ans = max(ans, dp[y][0]);// for(int i = 1; i <= n; i++) printf("%.1lf %.1lf\n ", dp[i][1], dp[i][0]); printf("%.1lf", ans * k); return 0;}

 

一世安宁

 

转载于:https://www.cnblogs.com/GTBD/p/10197688.html

你可能感兴趣的文章
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>