当前位置: 首页 > news >正文

Codeforces Round #636 (Div. 3) E. Weights Distributing(bfs求无向无权图最短路径)

题目链接


在这里插入图片描述
1.题目大意:给出一个无向无权图和三个顶点 a , b , c a,b,c a,b,c,要求先从 a a a走到 b b b再从 b b b走到 c c c。现在可以给每一条边分配一个权重,问如何分配使得 a − > b − > c a->b->c a>b>c的权值和最小

2.第一眼的想法:我们可以先从 a a a开始直接走到 b b b,记录下来它的最短路径,建立一个边 ( p a i r ) (pair) (pair)对应的 m a p map map,更新无向图路径的无向边;同理 b − > c b->c b>c,那么最后得到的是每条无向边出现的频率,然后肯定是出现次数最多的分配最小的权值,详见传送门。但是没想到的是 b f s bfs bfs只保证了走的最短路径,但是路径可能有多条,最好的是走两种路径尽量重合多的边,但是这没办法控制,因此此方法行不通

3.正解:

  • a − > b − > c a->b->c a>b>c的路径,假设可以由边 x x x作中转点,那么如果路径重复的话就是 a − > x − > b − > x − > c a->x->b->x->c a>x>b>x>c(路径不重复其实 x x x就是 b b b点),如下图所示
    在这里插入图片描述
  • b f s bfs bfs分别求出 a , b , c a,b,c a,b,c到其他任意点的最短路径长度
  • 预处理走 k k k条不重复边需要的最小权值,也就是先给权值数组排序再取第 k k k前缀和,设前缀和数组为 s s s
  • 枚举每个可能的 x x x点,那么 a − > b − > c a->b->c a>b>c的路径的种数为== a a a x x x的距离+ b b b x x x的距离+ c c c x x x的距离==。而最小的权值应先分配给 b − > x b->x b>x的这段路径,因为 b − > x b->x b>x要走两遍,而 a − > x a->x a>x c − > x c->x c>x只需要走一遍。因此,最小值即为 s [ a s[a s[a x x x的距离+ b b b x x x的距离+ c c c x x x的距离 ] ] ]+ s [ b s[b s[b x x x的距离 ] ] ]
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=2e5+10;

vector<int> G[maxn];
ll value[maxn];
bool vis[maxn];
int d1[maxn],d2[maxn],d3[maxn];  //分别表示a,b,c到各点的距离

void bfs(int u,int *dis){
	memset(vis,0,sizeof vis);
	queue<int> q;
	vis[u]=1;
	dis[u]=0;
	q.push(u);
	while(!q.empty()){
		int v=q.front(); q.pop();
		for(auto i : G[v]){
			if(!vis[i]){
                vis[i]=1;
                dis[i]=dis[v]+1;
                q.push(i);
			}
		}
	}
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t,n,m,a,b,c,x,y;
	cin>>t;
	while(t--){
		cin>>n>>m>>a>>b>>c;
		for(int i=1;i<=m;i++) cin>>value[i];
        for(int i=0;i<=n;i++) G[i].clear();
        for(int i=1;i<=m;i++){
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}
		bfs(a,d1);
		bfs(b,d2);
		bfs(c,d3);
        sort(value+1,value+1+m);
		for(int i=1;i<=m;i++)
            value[i]+=value[i-1];
		ll ans=INF;
		for(int i=1;i<=n;i++){
			if(d1[i]+d2[i]+d3[i]<=m)  //注意这里的特判
                ans=min(ans,value[d1[i]+d2[i]+d3[i]]+value[d2[i]]);
		}
		cout<<ans<<endl;
	}
    return 0;
}

相关文章:

  • 另一种MTK特效制作的方法,层复制
  • 字典树(Trie)——入门篇
  • 警惕:电信加紧发力为哪般?(下)
  • Codeforces Round #637 (Div. 2) C. Nastya and Strange Generator(阅读理解/思维)
  • Broken Space Bar(Trie)[待补]
  • 小白兔和小灰兔
  • VC图片显示特效
  • UVA1153 Keep the Customer Satisfied(贪心+优先队列)
  • UVA10570 Meeting with Aliens(枚举/优化)
  • flash小实验
  • 2019 ICPC Greater New York Region J - Unicycles (规律+递推+矩阵快速幂)
  • WebLogic 9.2中文帮助网站公测中,欢迎大家访问!
  • 2019 ICPC Greater New York Region C - PassTheBuck(概率)
  • Oracle11gR2安装简介
  • 2019 ICPC Greater New York Region I - RationalBase(思维+进制转换)
  • 分享的文章《人生如棋》
  • Bytom交易说明(账户管理模式)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ECS应用管理最佳实践
  • extract-text-webpack-plugin用法
  • gops —— Go 程序诊断分析工具
  • Mac转Windows的拯救指南
  • node入门
  • React+TypeScript入门
  • vue-cli在webpack的配置文件探究
  • vue脚手架vue-cli
  • Vue全家桶实现一个Web App
  • windows下mongoDB的环境配置
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)56
  • 容器服务kubernetes弹性伸缩高级用法
  • 微信开源mars源码分析1—上层samples分析
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​业务双活的数据切换思路设计(下)
  • #13 yum、编译安装与sed命令的使用
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)STL算法之比较
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)scrum常见工具列表
  • (转)菜鸟学数据库(三)——存储过程
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .cn根服务器被攻击之后
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET delegate 委托 、 Event 事件
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • /var/lib/dpkg/lock 锁定问题
  • []sim300 GPRS数据收发程序
  • [AIGC] 如何建立和优化你的工作流?
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [CentOs7]iptables防火墙安装与设置
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]