AtCoder Beginner Contest 252 E - Road Reduction

求以1为根的生成树各个节点与根距离之和的最小值,各个节点与根的距离最小值可以用dij求出
保留的边的数量一定是n-1条
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
typedef pair<LL,int> PLI;

const int N = 2e5+10;

int head[N],vis[N],cnt;
LL dis[N];
int st[N];

struct BIAN{
	int to,next;
	int len;
}bian[2*N];

void add(int x,int y,int z){
	bian[++cnt].to=y;
	bian[cnt].len=z;
	bian[cnt].next=head[x];
	head[x]=cnt;
}

priority_queue<PLI,vector<PLI>,greater<PLI> > q;

void dij(){
	dis[1]=0;
	q.push({0,1});
	while(!q.empty()){
		int x=q.top().second;
		q.pop();	
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i!=-1;i=bian[i].next){
			int y=bian[i].to;
			if(dis[y]>dis[x]+bian[i].len){
				dis[y]=dis[x]+bian[i].len;
				st[y]=i+1>>1;
				q.push({dis[y],y});
			}
		}	
	}
}

int main(){
	memset(head,-1,sizeof head);
	memset(dis,0x3f,sizeof dis);
	int n,m; 
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	dij();
	for(int i=2;i<=n;i++) cout<<st[i]<<" ";
}
posted @ 2022-05-24 20:43  xhy666  阅读(98)  评论(0)    收藏  举报