刚学OI $10^{-9}$s的萌新求助 只过了样例
查看原帖
刚学OI $10^{-9}$s的萌新求助 只过了样例
163337
Zpair楼主2022/1/11 19:35

不是妹子 可以女装qwq

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
const int INF=0x7f7f7f7f;
struct Edge{
	int head[MAXN],to[MAXN*2],nxt[MAXN*2],vale[MAXN*2],tot;
	void add(int x,int y,int v){
		to[++tot]=y;
		vale[tot]=v;
		nxt[tot]=head[x];
		head[x]=tot;
	}
}G,T;
vector<pair<pair<int, int>, int> > Ne;
int dis[MAXN],n,m;
void build_tree(){	
	cin>>n>>m;
	int x,y,z;
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&x,&y,&z);
		G.add(x,y,z);
		G.add(y,x,z);
	}
	priority_queue<pair<int, int> > q;
	for(int i=1;i<=n;++i)
		dis[i]=INF;
	dis[1]=0;
	for(int i=1;i<=n;++i)
		q.push(make_pair(-dis[i],i));
	while(!q.empty()){
		int v=-q.top().first,p=q.top().second;
		q.pop();
		if(dis[p]<v)continue;
		for(int i=G.head[p];i;i=G.nxt[i])
			if(dis[G.to[i]]>dis[p]+G.vale[i]){
				dis[G.to[i]]=dis[p]+G.vale[i];
				q.push(make_pair(-dis[G.to[i]],G.to[i]));
			}
	}
	for(int p=1;p<=n;++p)
		for(int i=G.head[p];i;i=G.nxt[i]){
			if(dis[p]+G.vale[i]==dis[G.to[i]])
				T.add(p,G.to[i],G.vale[i]);
			else if(dis[p]==dis[G.to[i]]+G.vale[i])
				T.add(p,G.to[i],G.vale[i]);
			else Ne.push_back(make_pair(make_pair(p,G.to[i]),G.vale[i]));
		}
}
int fa[MAXN],dep[MAXN],siz[MAXN],son[MAXN];
int top[MAXN],mp[MAXN],tot;
void dfs_build(int p){
	dep[p]=dep[fa[p]]+1;
	siz[p]=1;
	for(int i=T.head[p];i;i=T.nxt[i]){
		if(T.to[i]==fa[p])continue;
		fa[T.to[i]]=p;
		dfs_build(T.to[i]);
		siz[p]+=siz[T.to[i]];
		if(siz[son[p]]<siz[T.to[i]])
			son[p]=T.to[i];
	}
}
void dfs_top(int p){
	top[p]=son[fa[p]]==p?top[fa[p]]:p;
	mp[p]=++tot;
	if(son[p])dfs_top(son[p]);
	for(int i=T.head[p];i;i=T.nxt[i])
		if(T.to[i]!=son[p]&&T.to[i]!=fa[p])
			dfs_top(T.to[i]);
}
int a[MAXN*4],lazy[MAXN*4];
#define lson(p) ((p)<<1)
#define rson(p) ((p)<<1|1)
void pushdown(int p){
	if(!lazy[p])return;
	a[lson(p)]=min(a[lson(p)],lazy[p]);
	lazy[lson(p)]=min(lazy[lson(p)],lazy[p]);
	a[rson(p)]=min(a[rson(p)],lazy[p]);
	lazy[rson(p)]=min(lazy[rson(p)],lazy[p]);
	lazy[p]=0;
}
void modify(int x,int y,int l,int r,int v,int p){
	if(l<=x&&r>=y){
		lazy[p]=min(lazy[p],v);
		a[p]=min(a[p],v);
		return;
	}
	pushdown(p);
	int mid=(x+y)>>1;
	if(l<=mid)modify(x,mid,l,r,v,lson(p));
	if(r>mid)modify(mid+1,y,l,r,v,rson(p));
	a[p]=min(a[lson(p)],a[rson(p)]);
}
int query(int x,int y,int idx,int p){
	if(x==y)
		return a[p];
	pushdown(p);
	int mid=(x+y)>>1;
	if(idx<=mid)return query(x,mid,idx,lson(p));
	if(idx>mid)return query(mid+1,y,idx,rson(p));
}
void Modify(int x,int y,int v){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		modify(1,n,mp[top[x]],mp[x],v,1);
		x=fa[top[x]];	
	}
	if(dep[x]<dep[y])swap(x,y);
	modify(1,n,mp[y]+1,mp[x],v,1);
}
int Find(int x){
	return query(1,n,mp[x],1);
}
int main(){
	build_tree();
	memset(a,INF,sizeof(a));
	dfs_build(1);
	dfs_top(1);
	for(int i=0;i<Ne.size();++i)
		Modify(Ne[i].first.first,Ne[i].first.second,dis[Ne[i].first.first]+dis[Ne[i].first.second]+Ne[i].second);
	int x;
	for(int i=2;i<=n;++i)
		printf("%d\n",(x=Find(i))==INF?-1:x-dis[i]);
}
2022/1/11 19:35
加载中...