前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >研华acdp手机版_acwing算法基础

研华acdp手机版_acwing算法基础

作者头像
全栈程序员站长
发布于 2022-09-22 04:00:23
发布于 2022-09-22 04:00:23
73800
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

你准备游览一个公园,该公园由 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入样例:
7
3 8
7 2
4 2
1 4
1 9
3 4
2 3
输出样例:
24
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ACT初代奥特曼_ac自动机上dp
上帝手中有 N 种世界元素,每种元素可以限制另外 1 种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。
全栈程序员站长
2022/09/22
1640
ac测评题库_acwing算法基础
幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。
全栈程序员站长
2022/09/22
3640
ac测评题库_acwing算法基础
怎么判断草图完全约束_算法基础课acwing下载
在每一步操作中,鲍勃都可以选取一个点,并将所有射入该点的边移除或者将所有从该点射出的边移除。
全栈程序员站长
2022/09/22
4040
怎么判断草图完全约束_算法基础课acwing下载
acwing-1080. 骑士(基环树dp)[通俗易懂]
可是,最近发生了一件很可怕的事情:邪恶的 Y 国发起了一场针对 Z 国的侵略战争。
全栈程序员站长
2022/09/22
3050
acwing-2189. 有源汇上下界最大流
接下来 m 行,每行包含四个整数 a,b,c,d 表示点 a 和 b 之间存在一条有向边,该边的流量下界为 c,流量上界为 d。
全栈程序员站长
2022/09/22
1940
负载均衡的算法有哪些_acwing是什么
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168566.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
4900
无源汇上下界可行流_格怎么找最小上界和最大下界
接下来 m 行,每行包含四个整数 a,b,c,d 表示点 a 和 b 之间存在一条有向边,该边的流量下界为 c,流量上界为 d。
全栈程序员站长
2022/09/22
2460
acwing-2175. 飞行员配对方案问题(二分图|最大流)「建议收藏」
由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 2 名飞行员,其中 1 名是英国飞行员,另 1 名是外籍飞行员。
全栈程序员站长
2022/09/22
2910
Codeforces 的题目真的值得算法竞赛选手训练吗?
个串,有两种操作,一种是给某个串加一个字符,另一种是求存不存在一个串是查询串的子串。强制在线。
ACM算法日常
2021/11/10
9560
闫学灿acwing_AAU BBU RRU
接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。
全栈程序员站长
2022/09/22
3580
HDU 5458 Stability(树链剖分+ 并查集)
2.如果删除(u, v)间的一条边可使其不连通,找出这样的边的个数,就是找(u, v)间桥的个数
用户2965768
2019/08/29
3400
2021(ICPC)亚洲区域赛昆明站(CGHIJLM)
有n个城市,每个城市归某个议院管辖,每次可以选择相邻的几座归属于同一个议院的城市,将他们交给别的议院管辖,问最少的操作数使得最终全部城市归属一个议院。初始状态时,一个议院最多管辖15座城市。
Here_SDUT
2022/08/09
1.1K0
《图》相关刷题
用户11039529
2024/04/10
890
acwing1072. 树的最长路径(树形dp)
给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。
全栈程序员站长
2022/09/22
4750
最小生成树的个数_最小生成树的实际应用
设最小生成树的边权之和为 sum,严格次小生成树就是指边权之和大于 sum 的生成树中最小的一个。
全栈程序员站长
2022/09/22
6090
【UVALive - 6534 】Join two kingdoms (树的直径的期望)
给两棵树,分别有 n,m 个节点(1 ≤ N, Q ≤ 4 × 10^4),等概率连接属于不同树的两个节点,求新树的直径(最远两点的距离)的期望。
饶文津
2020/06/02
4170
【UVALive - 6534 】Join two kingdoms (树的直径的期望)
POJ - 3281 Dining 网络流
题意:n个奶牛,有 f 种食物, d种饮料。 接下来n行,每行先是f1,d1,接下来f1个食物,d1个饮料 表示该奶牛喜欢的食物和水。求最多有多少奶牛能得到自己喜欢的食物。
用户2965768
2019/08/14
4390
ac测评题库_用标号法求网络最大流
接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。
全栈程序员站长
2022/09/22
2890
无类路由计算方法_actin
给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量和费用,边的容量非负。
全栈程序员站长
2022/09/22
2440
圆桌排列组合问题_圆桌相邻概率
会议餐厅共有 n 张餐桌,每张餐桌可容纳 ci(i=1,2,…,n) 个代表就餐。
全栈程序员站长
2022/09/22
4640
相关推荐
ACT初代奥特曼_ac自动机上dp
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验