首页 > 其他分享 >[BZOJ3694. 最短路]

[BZOJ3694. 最短路]

时间:2022-09-28 09:46:56浏览次数:76  
标签:const BZOJ3694 int 短路 更新 include

BZOJ3694. 最短路

并查集: 按权值排序,暴力更新;每次记录一个祖先: 从没有被更新的开始更新

点击查看代码
</details>
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int N = 4005, M = 5e5 + 5;
int n, m;
int h[N], e[N << 1], w[N << 1], nxt[N << 1], idx;
struct E { int a, b, c; } edges[M]; int tot; // 非树边
int dist[N], fa[N], father[N];
int from[N];
void add(int a, int b, int c) {
	e[++ idx] = b, w[idx] = c, nxt[idx] = h[a], h[a] = idx;
}
void dfs(int u) {
	for(int i = h[u]; i; i = nxt[i]) {
		int v = e[i];
		if(v == fa[u]) continue;
		dist[v] = dist[u] + w[i], fa[v] = u;
		dfs(v);
	}
}
int find(int x) {
	if(x == father[x]) return x;
	return father[x] = find(father[x]);
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1, a, b, c, t; i <= m; i ++) {
		scanf("%d%d%d%d", &a, &b, &c, &t);
		if(t) add(a, b, c), add(b, a, c);
		else edges[++ tot] = {a, b, c};
	}
	dfs(1);
	for(int i = 1; i <= tot; i ++)
		edges[i].c += dist[edges[i].a] + dist[edges[i].b];
	std::sort(edges + 1, edges + tot + 1, [](const E&a, const E&b) { return a.c < b.c; });
	for(int i = 1; i <= n; i ++) father[i] = i;
	for(int i = 1; i <= tot; i ++) {
		int x = find(edges[i].a), y = find(edges[i].b);
		while(x != y) {
			if(dist[x] < dist[y]) x ^= y ^= x ^= y;
			if(!from[x]) from[x] = i; // 被更新了
			x = fa[x] = find(fa[x]); // 暴力向上跳
		}
	}
	for(int i = 2; i <= n; i ++)
		if(from[i]) printf("%d ", edges[from[i]].c - dist[i]);
		else printf("-1 ");
	return 0;
}

标签:const,BZOJ3694,int,短路,更新,include
From: https://www.cnblogs.com/azzc/p/16736912.html

相关文章

  • 最小转弯次数问题与最短路的不同
    最小转弯链接http://ac.nowcoder.com/acm/contest/26077/1021点击查看代码#include<bits/stdc++.h>usingnamespacestd;charmp[200][200];structty{intx......
  • luogu P1772 [ZJOI2006] 物流运输 (dp, 最短路)
    https://www.luogu.com.cn/problem/P1772虽然是图论背景,但是1-n天之间是线性关系。没法贪心决策,考虑dp:我本来写的dp是i-1转移到i,但是这样没法处理哪一天能走哪些最短路......
  • CF238E Meeting Her【DP,最短路】
    传送门显然,如果节点\(u\)不是\(s_i\tot_i\)的必经点,那么在\(u\)等\(i\)号车是没有前途的。类似地,若在\(u\)处上了\(i\)号车,且\(v\)不是\(s_i\tot_i\)......
  • 五种基础的最短路算法总结与证明
    朴素版dijkstra:进行n-1次松弛操作,每次都用当前dist最小的点更新,这样就能保证经过了n-1次松弛之后,起点到其他点的距离一定是最短的(On^2)堆优化......
  • C语言短路与短路或
    在C语言中短路与&&短路或||在进行#include<stdio.h>intmain(){ inta=1,b=2,c=3,d=4,m=2,n=2; //在这里如果m=a>b第一个表达式结果为1就是true,第二个表达式......
  • 任意两点间的最短路径
    任意两点间的最短路径用floyd算法voidfloyd(){for(intk=1;k<=N;++k){for(inti=1;i<=N;++i){for(intj=1;j<=N;++j){if(......
  • NOIP复习(一)最短路
    dijkstra复习一遍模板。Dijkstra模板适用性:适用于非负权图。每个点第一次从堆中被取出时,其\(dis\)一定是最短路。\(Dijkstra\)贪心的正确性:现证明:取出\(x\)时,它......
  • 最短路
    Floyd算法voidfloyed(){memset(f,0x3f,sizeoff);for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(a[i][j]!=0)f[i][j]=a[i][j];......
  • GYM100851 F - Froggy Ford(最短路铜牌题)
    题意:​ 现在有一条河,河中有n个石头,你需要从河的一端到河的另一端。现在你有一次机会在任意位置放置一个石头,请问石头放在哪里可以使过河的最长路径最短。请输出放置的石头......
  • 最短路算法之 Dijkstra
    部分内容参考了李煜东的《算法竞赛进阶指南》,在此声明。单源最短路径单源最短路径问题,是说,给定一张有向图(无向图)\(G=(V,E)\),\(V\)是点集,\(E\)是边集,\(|V|=n\),\(|......