新手刚学OI,60pts玄关求条
查看原帖
新手刚学OI,60pts玄关求条
1394167
li00000000a楼主2025/6/21 09:37
#include<bits/stdc++.h>
using namespace std;
const int N=60,inf=0x3f3f3f3f;
int n,k,m,tu[N][N],dist[N][N][N];
signed main(){
	cin>>n>>m>>k;
	memset(dist,inf,sizeof(dist));
	memset(tu,inf,sizeof(tu));
	for(int i=1;i<=m;i++){
		int aa,bb,tt;
		cin>>aa>>bb>>tt;
		tu[aa][bb] = tu[bb][aa] = tt;
		dist[aa][bb][0] = dist[bb][aa][0] = tt;
	}
	for(int d=1;d<=n;d++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i==j || j==d || i==d) continue;
				dist[i][j][0] = min(dist[i][j][0],dist[i][d][0] + dist[d][j][0]);
			}
		}
	}
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			dist[i][j][1] = dist[i][j][0];
			if(tu[i][j] != inf) dist[i][j][1] = tu[i][j]/2;
		} 
	
	for(int t=1;t<=k;t++){
		for(int d=1;d<=n;d++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(i==j || i==d || j==d) continue;
					dist[i][j][t] = min(dist[i][j][t],dist[i][d][t-1] + tu[d][j]/2);
				}
			}
		}
		
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++) dist[i][j][t+1] = dist[i][j][t];
	}
	
	cout<<min(dist[1][n][k],dist[n][1][k])<<"\n";
	return 0;
}
2025/6/21 09:37
加载中...