洛谷P2176 [USACO11DEC] RoadBlock S / [USACO14FEB]Roadblock G/S
创始人
2025-01-16 01:05:12
0

题意

给定一张 n n n 点 m m m 边的无向图,请选择一条边,将其边权加倍,最多可使最短路增长多少?

思路

暴力做法:枚举所有边,将其边权加倍,跑一遍最短路,取最大值。
优化:由于修改最短路以外的边对最短路没有影响(除了变小),所以只需要枚举最短路上的边。
至于给边权加倍,我们不需要在邻接表中直接查找这条边来进行,只需在跑最短路时,传入两个参数 ( d u , d v ) (du,dv) (du,dv) ,表示要加倍的边的两个端点,只要当前边相连的是这两个点,就把边权加倍。下面是这种方法的实现。

// s - Source vertex. //  -> Edge that needs to be doubled. // The shortest distance is recorded in `dis`. // The precursor of each point is recorded in `pre`. auto dij = [&](int s, int du = -1, int dv = -1){ 	priority_queue, greater> q; 	dis[s] = 0; 	q.push({0, s}); 	 	while(q.size()){ 		int u = q.top().second; 		q.pop(); 		 		if(vis[u]) continue; 		vis[u] = true; 		  		for(auto &edge: G[u]){ 			int v = edge.first, w = edge.second; 			// If the current edge needs to be doubled 			if((du == u && dv == v) || (du == v && dv == u)) w <<= 1; 			if(dis[v] > dis[u] + w){ 				dis[v] = dis[u] + w; 				q.push({dis[v], v}); 				// Record the precursor. 				if(du == -1 && dv == -1) pre[v] = u; 			} 		} 	} }; 

代码

// Problem: P2176 [USACO11DEC] RoadBlock S / [USACO14FEB]Roadblock G/S // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P2176 // Memory Limit: 125 MB // Time Limit: 1000 ms //  // Powered by CP Editor (https://cpeditor.org)  #include #include using namespace std; #define int long long typedef pair PII; const int INF = 0x3f3f3f3f;  signed main() { 	ios::sync_with_stdio(0); 	cin.tie(0), cout.tie(0); 	 	int n, m; 	cin >> n >> m; 	 	vector> G(n); 	for(int i = 0, u, v, w; i < m; i++){ 		cin >> u >> v >> w; 		u--, v--; 		G[u].push_back({v, w}); 		G[v].push_back({u, w}); 	} 	 	 	vector dis(n, INF), pre(n, -1); 	vector vis(n, false); 	 	 	auto dij = [&](int s, int du = -1, int dv = -1){ 		priority_queue, greater> q; 		dis[s] = 0; 		q.push({0, s}); 		 		while(q.size()){ 			int u = q.top().second; 			q.pop(); 			 			if(vis[u]) continue; 			vis[u] = true; 			  			for(auto &edge: G[u]){ 				int v = edge.first, w = edge.second; 				if((du == u && dv == v) || (du == v && dv == u)) w <<= 1; 				if(dis[v] > dis[u] + w){ 					dis[v] = dis[u] + w; 					q.push({dis[v], v}); 					if(du == -1 && dv == -1) pre[v] = u; 				} 			} 		} 	}; 	 	dij(0); 	int mind = dis.back(), ans = 0; 	 	for(int i = n - 1; pre[i] != -1; i = pre[i]){ 		if(i == 0) continue; 		int u = pre[i], v = i; 		 		dis.assign(n, INF); 		vis.assign(n, false); 		 		dij(0, u, v); 		ans = max(ans, dis.back()); 	} 	cout << ans - mind << endl; 	return 0; } 

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...