50求条
查看原帖
50求条
1187849
FrankShix楼主2024/12/1 16:21
#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 5, M = 1e5 + 5;
struct Edge {
	int to, w;
};

vector<Edge> vt[N];
int n, m, k, dis[N], ans[N], u[M], v[M], w[M];

void dij()
{
	bool f[N];
	memset(f, 0, sizeof(f));
	dis[k] = 0;
	for (int i = 1; i < n; ++i)
	{
		int k = 0;
		for (int j = 1; j <= n; ++j)
			if (!f[j] && dis[j] < dis[k])
				k = j;
		f[k] = true;
		for (int j = 0; j < vt[k].size(); ++j)
		{
			int v = vt[k][j].to;
			if (f[v])
				continue;
			int w = vt[k][j].w;
			if (dis[v] > dis[k] + w)
				dis[v] = dis[k] + w;
		}
	}
}

int main()
{
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 0; i <= n; ++i)
		dis[i] = 1e9;
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d%d", &u[i], &v[i], &w[i]);
		vt[u[i]].push_back((Edge){v[i], w[i]});
	}
	dij();
	for (int i = 1; i <= n; ++i)
		ans[i] = dis[i];
	for (int i = 1; i <= n; ++i)
		vt[i].clear();
	for (int i = 1; i <= m; ++i)
		vt[v[i]].push_back((Edge){u[i], w[i]});
	dij();
	int maxx = -1;
	for (int i = 1; i <= n; ++i)
	{
		if (dis[i] == 1e9)
			continue;
		ans[i] += dis[i];
		maxx = max(maxx, ans[i]);
	}
	cout << maxx;
	return 0;
}
2024/12/1 16:21
加载中...