70pts求助
查看原帖
70pts求助
1140118
wanghaolin44243787楼主2024/8/6 15:56
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a,b,c,num;
double dis[55][55];
bool cmp[1005],w;
struct node{
	int to,from;
}via[1005];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dis[i][j]=0x7ffffff;
		}
		dis[i][i]=0;
	}
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		dis[a][b]=c;
		dis[b][a]=c;
		via[i].from=a;
		via[i].to=b;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);
				dis[k][j]=dis[j][k];
			}
		}
	}
	for(int i=1;i<=k;i++){
		w=0;
		for(int j=1;j<=m;j++){
			if(dis[1][n]>min(dis[1][via[j].from]+dis[via[j].from][via[j].to]/2.0+dis[via[j].to][n],dis[1][via[j].to]+dis[via[j].from][via[j].to]/2.0+dis[via[j].from][n])&&cmp[j]==0){
				w=1;
				dis[1][n]=min(dis[1][via[j].from]+dis[via[j].from][via[j].to]/2.0+dis[via[j].to][n],dis[1][via[j].to]+dis[via[j].from][via[j].to]/2.0+dis[via[j].from][n]);
				num=j;
				dis[n][1]=dis[1][n];
			}
		}
		if(w==0)break;
		w=0;
		cmp[num]=1;
		dis[via[num].from][via[num].to]/=2.0;
		dis[via[num].to][via[num].from]=dis[via[num].from][via[num].to];
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				dis[j][k]=min(dis[j][k],min(dis[j][via[num].from]+dis[via[num].from][via[num].to]+dis[via[num].to][k],dis[k][via[num].from]+dis[via[num].from][via[num].to]+dis[via[num].to][j]));
				dis[k][j]=dis[j][k];
			}
		}
	}
	cout<<dis[1][n];
	return 0;
}
2024/8/6 15:56
加载中...