求助60(边全incorrect)
查看原帖
求助60(边全incorrect)
174806
xbb2楼主2022/9/6 20:52
#include<bits/stdc++.h>
using namespace std;
const long long N=3e5+10;
long long u[N],v[N],w[N];
long long n,s,t,ans=0;
int col[N];
vector<pair<int,int> > a[N];
struct edge{
	int k;
	bool vis[N];
	long long d[N];
	long long f[N];
	void init(int x){k=x;return ;}
	void dijkstra(){
		memset(d,0x3f,sizeof(d));
		priority_queue<pair<int,int> > q;
		q.push(make_pair(0,k)),d[k]=0;
		while(!q.empty()){
			long long x=q.top().second;q.pop();
			if(vis[x])continue;vis[x]=true;
			for(long long i=0;i<a[x].size();i++){
				long long y=a[x][i].first;
				if(d[y]>d[x]+a[x][i].second)
					d[y]=d[x]+a[x][i].second,q.push(make_pair(-d[y],y));
			}
		}
	}
	void getfa(int x,int fa){
		for(int i=0;i<a[x].size();i++)
			if(a[x][i].first!=fa)
				f[a[x][i].first]=x,getfa(a[x][i].first,x);
	}
}T[5];
int main(){
	cin>>n>>s>>t;
	for(long long i=1;i<n;i++){
		scanf("%lld%lld%lld",&u[i],&v[i],&w[i]);
		a[u[i]].push_back(make_pair(v[i],w[i]));
		a[v[i]].push_back(make_pair(u[i],w[i]));
	}
	T[1].init(s),T[2].init(t);
	T[1].dijkstra(),T[2].dijkstra();
	T[1].getfa(s,0),T[2].getfa(t,0);
	for(long long i=1;i<=n;i++)
		ans+=min(T[1].d[i],T[2].d[i]);
	printf("%lld\n",ans);
	for(int i=1;i<n;i++){
		if(T[1].d[u[i]]<T[2].d[u[i]]){
			if(v[i]==T[1].f[u[i]]) col[i]=1;
			else if(u[i]==T[1].f[v[i]]) col[i]=2;
		}
		if(T[1].d[u[i]]>T[2].d[u[i]]){
			if(v[i]==T[2].f[u[i]]) col[i]=1;
			else if(u[i]==T[2].f[v[i]]) col[i]=2;
		}
	}
	for(int i=1;i<n;i++)printf("%d",col[i]);
	return 0;
} 
2022/9/6 20:52
加载中...