P3003,40pts,5个WA,一个RE
  • 板块题目总版
  • 楼主weichen123
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/6 20:05
  • 上次更新2023/11/2 22:32:11
查看原帖
P3003,40pts,5个WA,一个RE
657500
weichen123楼主2023/9/6 20:05
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
ll c,p,pb,pa1,pa2;
ll dis[200100],vis[200100],head[200100],num;
ll dis2[200100],vis2[200100];
ll ans,ans1,ans2,ans3; 
struct node{
	int u,v,w;
}a[200100];
void add(int from,int to,int dis){
	num++;
	a[num].u=head[from];
	a[num].v=to;
	a[num].w=dis;
	head[from]=num;
}
void spfa1(){
	queue<int> q;
	for(int i=1;i<=p;i++){
		dis[i]=0x3f3f3f;
		vis[i]=0;
	}
	q.push(pb);
	dis[pb]=0;
	vis[pb]=1;
	while(!q.empty()){
		int yy=q.front();
		q.pop();
		vis[yy]=0;
		for(int i=head[yy];i;i=a[i].u){
			int vv=a[i].v;
			if(dis[vv]>dis[yy]+a[i].w){
				dis[vv]=dis[yy]+a[i].w;
				if(vis[i]==0){
					vis[i]=1;
					q.push(vv);
				} 
			}
		}	
	}	
}
void spfa2(){
	queue<int> q1;
	for(int i=1;i<=p;i++){
		dis2[i]=0x3f3f3f;
		vis2[i]=0;
	}
	q1.push(pa1);
	dis2[pa1]=0;
	vis[pa1]=1;
	while(!q1.empty()){
		int yy=q1.front();
		q1.pop();
		vis2[yy]=0;
		for(int i=head[yy];i;i=a[i].u){
			int vv=a[i].v;
			if(dis2[vv]>dis2[yy]+a[i].w){
				dis2[vv]=dis2[yy]+a[i].w;
				if(vis2[i]==0){
					vis2[i]=1;
					q1.push(vv);
				} 
			}
		}	
	}	
}
int main() {
	cin>>c>>p;
	cin>>pb>>pa1>>pa2;
	for(int i=1;i<=c;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z); 
	}
	spfa1();
	ans1=dis[pa1];
	ans2=dis[pa2];
//	cout<<dis[pa1]<<" "<<dis[pa2];
	ans=min(ans1,ans2);
//	cout<<ans1<<" "<<ans2<<endl;
	spfa2();
	ans3=dis2[pa2];
	ans+=ans3;
	cout<<ans; 
	return 0; 
}
2023/9/6 20:05
加载中...