30pts 求调
查看原帖
30pts 求调
515129
TLEWA楼主2023/12/16 11:13
#include<bits/stdc++.h>
#define LL long long
#define int long long

using namespace std;

const int N=105;

int n,m,k;
vector<pair<int,int> > vec[N];

struct Martix {
	LL dp[N][N];
};

Martix operator*(const Martix& a,const Martix& b) {
	Martix newm;
	memset(newm.dp,63,sizeof(newm.dp));
	for(int i=1;i<=n;++i) {
		for(int j=1;j<=n;++j) {
			for(int k=1;k<=n;++k) {
				newm.dp[i][j]=min(newm.dp[i][j],a.dp[i][k]+b.dp[k][j]);
			}
		}
	}
	return newm;
}

LL dp[2][N][N];

Martix ans,first;

Martix qpow(Martix now,int k) {
	if(k==1) return now;
	if(k&1) return qpow(now*now,k/2)*now;
	else return qpow(now*now,k/2);
}

signed main() {
	cin >> n >> m >> k;
	
	memset(dp,63,sizeof(dp));
	
	for(int i=1;i<=n;++i)
		dp[0][i][i]=dp[1][i][i]=0;
	
	int u,v,w;
	for(int i=1;i<=m;++i) {
		cin >> u >> v >> w;
		vec[u].push_back(make_pair(v,w));
		vec[v].push_back(make_pair(u,w));
		dp[0][u][v]=dp[1][u][v]=w;
	}
	
	for(int k=1;k<=n;++k) {
		for(int i=1;i<=n;++i) {
			for(int j=1;j<=n;++j) {
				dp[0][i][j]=dp[1][i][j]=min(dp[0][i][k]+dp[0][k][j],dp[0][i][j]);
			}
		}
	}

	for(int u=1;u<=n;++u) {
		for(auto v_w:vec[u]) {
			auto v=v_w.first,w=v_w.second;
			for(int i=1;i<=n;++i) {
				for(int j=1;j<=n;++j) {
					dp[1][i][j]=min(dp[0][i][u]+dp[0][v][j]-w,dp[1][i][j]);
				}
			}
		}
	}
	
	if(k==0) {
		cout << dp[0][1][n];
		return 0;
	}
	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			first.dp[i][j]=dp[1][i][j];
	
	ans=qpow(first,k);
	
	cout << ans.dp[1][n];
	
	return 0;
}

只有 k=0k=0 的点过了

2023/12/16 11:13
加载中...