80分求助!!!挂在了 #7,#8,#11,#12
查看原帖
80分求助!!!挂在了 #7,#8,#11,#12
572228
WangSiHan_2011楼主2023/4/12 22:00

求助大佬!!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
typedef long long ll;
const int MAXN = 102;
const int MAXM = 2502;
const ll oo = 0x3f3f3f3f3f3f3f3f;

struct Edge
{
	int u,v,w;
};

int n,m,k;
ll f2[MAXN];
ll tmp[MAXN];
Edge edges[MAXM];
ll dis[MAXN][MAXN];
ll f[20][MAXN][MAXN];

void Floyd()
{
	memset(dis,oo,sizeof(dis));
	for(int i = 1;i <= n;i++)
		dis[i][i] = 0;
	
	for(int i = 1;i <= m;i++)
	{
		Edge &cur = edges[i];
		dis[cur.u][cur.v] = cur.w;
	}
	
	for(int k = 1;k <= n;k++)
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
}

int main()
{
	ios::sync_with_stdio(false);

#ifdef WSH
	freopen("Dk8se.in", "r", stdin);
	//freopen("Dk8se.out","w",stdout);
#endif

	cin >> n >> m >> k;
	for(int i = 1;i <= m;i++)
	{
		int u,v,w;
		cin >> u >> v >> w;
		edges[i] = {u,v,w};
	}
	
	Floyd();
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			ll tmp = dis[i][j];
			for(int k = 1;k <= m;k++)
			{
				Edge &cur = edges[k];
				tmp = min(tmp,dis[i][cur.u] + dis[cur.v][j] - cur.w);
			}
			
			f[0][i][j] = tmp;
		}
	}
	
	for(int l = 1;l <= log2(k);l++)
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				for(int k = 1;k <= n;k++)
					f[l][i][j] = min(f[l][i][j],f[l - 1][i][k] + f[l - 1][k][j]);
	
	for(int i = 1;i <= n;i++)
		f2[i] = dis[1][i];
	for(int l = 0;l <= log2(k);l++)
	{
		if(!(k >> l & 1))
			continue;
		memcpy(tmp,f2,sizeof(f2));
		memset(f2,oo,sizeof(f2));
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				f2[i] = min(f2[i],tmp[j] + f[l][j][i]);
	}
	
	cout << f2[n] << endl;
	return 0;
}

2023/4/12 22:00
加载中...