RE求助
查看原帖
RE求助
1121155
ccc66楼主2025/1/13 14:27
#include<bits/stdc++.h>
#include<vector>
//Dijkstra算法不能处理负边权 
using namespace std;
const long long int inf=1e10+5;
struct edge{
	long long int v,w;
};
vector<edge> mp[1020];
long long int n,s,a,dist[1020];//该点距离起点的最短路径 
bool f[1020];//判断是都已经进入到集合C 
void Dijkstra(int s){
	memset(f,0,sizeof(f));//标记全部为未访问 
	for(int i=1;i<=n;i++) dist[i]=inf;//初始距离重置为最大 
	dist[s]=0;//起点距离为0 
	while(true){//死循环,循环每个点,寻找不在集合C中的距离起点距离最小的点 
		int x=0;//标记 
		for(int i=1;i<=n;i++){
			if(!f[i]&&dist[i]<inf){//该点未访问并且距离被更新过(可到达) 
				if(x==0||dist[i]<dist[x]){//如果刚开始本轮或者寻找当前点的距离比C集合中最近的一个点 
					x=i;//记录最近点的编号 
				} 
			}
		}
		if(x==0) break;//如果所有点全部被放进集合C中,退出循环,算法结束 
		f[x]=true;//标记已经访问过 
		for(int i=0;i<mp[x].size();i++){//松弛操作,寻找该点出去最短的路径 
			int v=mp[x][i].v,w=mp[x][i].w;
			dist[v]=min(dist[v],dist[x]+w);
		}
	}
	return ;
}
int main(){
	cin>>n>>s>>a;
	int ans[1020],sum=0;
	int x[1020],y[1020],z[1020];
	for(int i=1;i<=s;i++){
		cin>>x[i]>>y[i]>>z[i];
		edge tmp;
		tmp.v=y[i],tmp.w=z[i];
		mp[x[i]].push_back(tmp);
	
	}
	Dijkstra(a);
	for(int i=1;i<=n;i++){
		ans[i]=dist[i];
	}
	for(int i=1;i<=n;i++) mp[i].clear();
	for(int i=1;i<=s;i++){
		edge tmp;
		tmp.v=x[i],tmp.w=z[i];
		mp[y[i]].push_back(tmp);
	
	}
	Dijkstra(a);
	for(int i=1;i<=n;i++){
		ans[i]+= dist[i];  
		sum=max(sum,ans[i]);  
	}
	cout<<sum;
	return 0;
} 
2025/1/13 14:27
加载中...