社区讨论

求助50分floyd最短路

P2009跑步参与者 8已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mi7yedj6
此快照首次捕获于
2025/11/21 05:38
4 个月前
此快照最后确认于
2025/11/21 06:43
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n, m, f[1001][1001], z;
char x, y, ss, ee;
int main()
{
	memset(f, -INF, sizeof(f));
	scanf("%d %d", &n, &m);
	for(register int i = 1; i <= n; ++i)
	{
		scanf("%d", &z);
		if(i == n)
		{
			f[n][1] = z;
			f[1][n] = z;
		}
		else
		{
			f[i][i + 1] = z;
			f[i + 1][i] = z;
		}
	}
	for(register int i = 1; i <= m; ++i)
	{
		cin >> x >> y >> z;
		int nx = x - 'A' + 1;
		int ny = y - 'A' + 1;
		if(nx != ny)
		{
			f[nx][ny] = max(f[nx][ny], z);
			f[ny][nx] = max(f[ny][nx], z);
		}
	}
	cin >> ss >> ee;
	int s = ss - 'A' + 1;
	int e = ee - 'A' + 1;
	for(register int i = 1; i <= n; ++i)
	{
		for(register int j = 1; j <= n; ++j)
		{
			if(f[i][j] < 0)
			{
				f[i][j] = INF;
			}
			if(i == j)
			{
				f[i][j] = 0;
			}
		}
	}
	for(register int i = 1; i <= n; ++i)
	{
		for(register int j = 1; j <= n; ++j)
		{
			for(register int k = 1; k <= n; ++k)
			{
				if(i != j && i != k && j != k)
				{
					f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
				}
			}
		}
	}
	printf("%d", f[s][e]);
	return 0;
}

回复

14 条回复,欢迎继续交流。

正在加载回复...