研华acdp手机版_acwing算法基础

研华acdp手机版_acwing算法基础你准备游览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿出发向另外一个岛屿建了一座桥,不过桥是可以双向行走的。同时,每对岛屿之间都有一艘专用的往来两岛之间的渡船。相对于乘船而言,你更喜欢步行。你希望所经过的桥的总长度尽可能的长,但受到以下的限制:可以自行挑选一个岛开始游览。任何一个岛都不能游览一次以上。无论任何时间你都可以由你现在所在的岛 S 去另一个你从未到过的岛 D。由 S 到 D 可以有以下方法:(1)步行:仅当两个岛之间有一座桥时才有可能。对于这种情况,桥的长度会累加到你步

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

你准备游览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿出发向另外一个岛屿建了一座桥,不过桥是可以双向行走的。

同时,每对岛屿之间都有一艘专用的往来两岛之间的渡船。

相对于乘船而言,你更喜欢步行。

你希望所经过的桥的总长度尽可能的长,但受到以下的限制:

可以自行挑选一个岛开始游览。
任何一个岛都不能游览一次以上。
无论任何时间你都可以由你现在所在的岛 S 去另一个你从未到过的岛 D。由 S 到 D 可以有以下方法:
(1)步行:仅当两个岛之间有一座桥时才有可能。对于这种情况,桥的长度会累加到你步行的总距离中。
(2)渡船:你可以选择这种方法,仅当没有任何桥和以前使用过的渡船的组合可以由 S 走到 D(当检查是否可到达时,你应该考虑所有的路径,包括经过你曾游览过的那些岛)。
注意,你不必游览所有的岛,也可能无法走完所有的桥。

请你编写一个程序,给定 N 座桥以及它们的长度,按照上述的规则,计算你可以走过的桥的最大长度。

输入格式
第 1 行包含整数 N。

第 2…N+1 行,每行包含两个整数 a 和 L,第 i+1 行表示岛屿 i 上建了一座通向岛屿 a 的桥,桥的长度为 L。

输出格式
输出一个整数,表示结果。

对某些测试,答案可能无法放进 32−bit 整数。

数据范围
2≤N≤106,
1≤L≤108

输入样例:
7
3 8
7 2
4 2
1 4
1 9
3 4
2 3
输出样例:
24
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const int M = 2 * N;
ll st[N],ins[N];
//pox_cir 保留每一个环的末尾位置
ll pox_cir[N],cir[N],pre[N],tw[N];
ll prew[N],a[2 * N],s[2 * N],cnt_cir = 0;
ll d[N],da[N];
struct { 

ll v,next,w;
}edge[M];
ll head[N],cnt;
ll ans = 0;
ll q[2 * N],hh = 0,tt = 0;
void add(int u,int v,int w){ 

edge[cnt].w = w;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
ll max(ll &a ,ll &b){ 

return  a > b ? a : b;
}
void dfs_c(int u,int from){ 

st[u] = ins[u] = true;
for(int i = head[u];~i;i = edge[i].next){ 

if((i ^ 1) == from)continue;
ll v = edge[i].v,w = edge[i].w;
pre[v] = u,prew[v] = w;
if(!st[v])dfs_c(v,i);
else if(ins[v]){ 

cnt_cir ++;
pox_cir[cnt_cir] = pox_cir[cnt_cir - 1];
for(int k = u;k != v;k = pre[k]){ 

tw[k] = prew[k];
cir[++ pox_cir[cnt_cir]] = k;
}
tw[v] = prew[v],cir[++ pox_cir[cnt_cir]] = v;
}
}
ins[u] = false;
}
ll dfs_d(int u,int fa){ 

ll d1 = 0,d2 = 0;
for(int i = head[u];~i; i = edge[i].next){ 

ll v = edge[i].v,w = edge[i].w;
if(v == fa || st[v])continue;
ll d = dfs_d(v,u) + w;
if(d >= d1)d2 = d1,d1 = d;
else if(d > d2)d2 = d;
}
ans = max(ans,d1 + d2);
return d1;
}
int main(){ 

int n;
memset(head,-1,sizeof head);
cin>>n;
int x,w;
for(int i = 1;i <= n;i ++){ 

scanf("%d %d",&x,&w);
add(i,x,w),add(x,i,w);
}
for(int i = 1;i <= n;i ++){ 

if(!st[i]){ 

dfs_c(i,-1);
}
}
// cout<<cnt_cir<<endl;
// for(int i = 1;i <= pox_cir[cnt_cir];i ++){ 

// cout<<cir[i]<<" ";
// }
memset(st,0,sizeof st);
for(int i = 1;i <= pox_cir[cnt_cir];i ++)st[cir[i]] = true;
ll res = 0;
for(int i = 1;i <= cnt_cir;i ++){ 

ll ss = pox_cir[i - 1] + 1,ee = pox_cir[i];
ll aans = 0;
for(ll j = ss;j <= ee;j ++){ 

ll v = cir[j];
ans = 0;
ll res = dfs_d(v,-1);
d[v] = res,da[v] = ans;
aans = max(aans,da[v]);
}
int m = ee - ss + 1;
for(ll i = 0;i < m;i ++){ 

a[i] = cir[ee - i];
if(i != 0)s[i] = s[i - 1] + tw[a[i]];
else s[i] = tw[a[i]];
}
for(int i = 0;i < m - 1;i ++)a[i + m] = a[i],s[i + m] = s[i + m - 1] + tw[a[i + m]];
// for(int i = 0;i < 2 * m - 1;i ++){ 

// cout<<a[i]<<" "<<s[i]<<endl;
// }
hh = tt = 0;
ll t = 0;
for(int i = 0;i < 2 * m - 2;i ++){ 

if(hh != tt && q[hh] <= i - (m - 1))hh ++;
while(hh != tt && d[a[q[tt - 1]]] - s[q[tt - 1]] <= d[a[i]] - s[i])tt --;
q[tt ++] = i;
if(i >= m - 2){ 

aans = max(aans,d[a[i + 1]] + s[i + 1] + d[a[q[hh]]] - s[q[hh]]);
}
}
res += aans;
}
printf("%lld\n",res);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168540.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • scrapy爬虫部署服务器「建议收藏」

    scrapy爬虫部署服务器「建议收藏」scrapy爬虫部部署服务器时间:2020年5月27日18:28:30作者:钟健记录:scrapy爬虫关键字:scrapyscrapydscrapydweb一、scrapy爬虫部署服务器scrapy通过命令行运行一般只用于测试环境,而用于运用在生产环境则一般都部署在服务器中进行远程操作。scrapy部署服务器有一套完整的开源项目:scrapy+scrapyd(服务端)+scrapy-client(客户端)+scrapydweb1、scrapyd1.介绍Scrapyd是用于部署和运

  • flowable 流程引擎总结

    flowable 流程引擎总结最近公司使用Flowable开发了自己的OA系统,因此对Flowable的相关内容进行如下总结一、Flowable是什么目前最新版是Flowable6.4.2(2019年07月26日)官网地址:https://www.flowable.org/github地址:https://github.com/flowableFlowable是一个使用Java编写的轻量级业务流程引擎,使用ApacheV2license协议开源。2016年10月,Activiti工作流引.

    2022年10月20日
  • 通信原理一个月能学会吗_通信原理第六版

    通信原理一个月能学会吗_通信原理第六版Socket通信原理对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:什么是TCP/IP、UDP?Socket在哪里呢?Socket是什么呢?你会使用它们吗?什么是TCP/IP、UDP?TCP/IP(TransmissionControlPro…

    2022年10月17日
  • win11频繁更新,关闭win11恶意软件删除工具补丁更新

    win11频繁更新,关闭win11恶意软件删除工具补丁更新win11补丁更新主要包含4部分:第一部分功能更新,涉及Windows功能bug、新增的功能等;第二部分质量更新,涉及安全风险的更新;第三部分驱动更新,涉及厂商等提交给微软的驱动,进行更新;第四部分其它更新,目前主要发现的是,恶意软件删除工具更新。恶意软件删除工具,如果有第三方安全软件的话,这个补丁意义不大,并且恶意的标准是微软自家定义的,就看你是否接受微软自带的杀毒软件,如果用可以更新,如果不用该补丁频率高,无必要。关闭“恶意软件删除更新”,只需要用dism++关闭,步骤如下:

  • 如何用腾讯云服务器搭建网站[通俗易懂]

    如何用腾讯云服务器搭建网站[通俗易懂]对于新手开发者用户,若想搭建一个简单的网站,只需通过以下5个步骤即可拥有属于自己的网站。1,注册/转入域名域名注册是在互联网上建立任何服务的基础,搭建一个网站前首先需拥有一个域名。1.如果已经在其他注册商拥有了自己的域名,可以域名转入。如果还没有域名,就需要进行域名注册。注册域名时,建议选择自己喜欢的、简单、易记的英文字母,并与自己网站性质相关。2,购买腾讯云服务器网站在Internet需要有一个空间作为载体存放用户的网站信息,所以需要购买腾讯云服务器。腾讯云服务器(CVM

  • Mysql数据库表结构设计导出[通俗易懂]

    Mysql数据库表结构设计导出[通俗易懂]SELECTCOLUMN_NAME字段名,COLUMN_TYPE数据类型(长度),–DATA_TYPE字段类型,–CHARACTER_MAXIMUM_LENGTH长度,if(IS_NULLABLE=’NO’,’否’,’是’)是否为空, if(COLUMN_KEY=’PRI’,’是’,’否’) 是否为主键,–COLUMN_DEFAULT默认值,COLUMN_COMMENT说明FROMINFO

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号