萌新冒泡
首先有个套路 只要题目中说了源点到每个点最短路径是唯一的 那往往都和最短路树有关系
题意是求不能经过最后一条边的次短路 要使得这条路最短 显然要尽量的多走最短路径上的路
假设现在要求1->x 我们考虑走了一段最短路径后如何跳到x点
设当前点为u 选择与u点相连的一条非树边(这条边连向x的子树内的某点v) 然后ans[x]=dis[u]+w(u,v)+(dis[v]-dis[x])
然后我们就可以暴力枚举每条非树边暴力更新啦!
仔细观察发现 对于每条非树边 dis[u]+w(u,v)+dis[v]是个定值
wow 那把这个值算出来 排个序 似乎还是要扫一遍?不过如果强烈安利并查集——可以维护哪些点已经被修改过了,因为被修改过的点肯定是连续的
然后好像卡SPFA是出题人的基本素养
#include<bits/stdc++.h>
const int N=100005;
const int M=200005;
const int INF=0x3f3f3f3f;
using namespace std;
int n,m;
struct Edge
{
int from,to,next,val;
}edge[2*M];
int first[N],tot;
inline void addedge(int x,int y,int z)
{
tot++;
edge[tot].from=x; edge[tot].to=y; edge[tot].next=first[x]; edge[tot].val=z; first[x]=tot;
}
typedef pair<int,int> Pair;
priority_queue<Pair,vector<Pair>,greater<Pair> >