奇怪MLE
查看原帖
奇怪MLE
389441
Microscopic_WaXeR楼主2024/4/26 22:38
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100010,M=200010;
int n,m,k;
int head[N],cnt=1;
int lst[N],dis[N];
bool vis[N],ve[M];
int fa[N],nxt[N],res[N];
struct Edge{
	int to,nxt,w;
}e[M<<1];
struct new_edge{
	int w,u,v;
	bool operator <(const new_edge &b) const{
		return w<b.w;
	}
}ne[M<<1];
void add(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int find(int x){
	if(nxt[x]==x) return x;
	return nxt[x]=find(nxt[x]);
}
priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void Dijkstra(){
	memset(dis,0x3f,sizeof dis);
	dis[1]=0;
	q.push(make_pair(0,1));
	int x,w;
	while(!q.empty()){
		x=q.top().second,w=q.top().first;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		ve[lst[x]]=1;
		for(int i=head[x];i;i=e[i].nxt){
			int y=e[i].to;
			if(dis[y]>w+e[i].w){
				dis[y]=w+e[i].w;
				lst[y]=i;
				q.push(make_pair(dis[y],y));	
			}
		}
	}
}
void dfs(int x,int ff){
	fa[x]=ff;
	int y;
	for(int i=head[x];i;i=e[i].nxt){
		y=e[i].to;
		if(y==ff || !ve[i]) continue;
		dfs(y,x);
	}	
}
int main(){
	cin>>n>>m;
	int u,v,w;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		add(u,v,w);add(v,u,w);
	}
	Dijkstra();
	dfs(1,0);
	for(int i=1;i<=n;i++){
		//cout<<i<<' '<<fa[i]<<endl;
		nxt[i]=i;res[i]=-1;
		for(int j=head[i];j;j=e[j].nxt)	
			if(!ve[j] && !ve[j^1]){
				ne[++k]=new_edge{e[j].w+dis[i]+dis[e[j].to],i,e[j].to};
				ve[j]=1;
			}
	}
	sort(ne+1,ne+1+k);
	for(int i=1;i<=k;i++){
		u=ne[i].u;v=ne[i].v;w=ne[i].w;
		//cout<<u<<' '<<v<<' '<<w<<endl;
		u=find(u);v=find(v);
		while(u!=v){
			if(dis[u]<dis[v])
				swap(u,v);
			res[u]=w-dis[u];
			nxt[u]=fa[u];
			u=find(u);
		}
	}
	for(int i=2;i<=n;i++)
		cout<<res[i]<<endl;
	return 0;
}

2024/4/26 22:38
加载中...