2019ICPC 南京网赛 H. Holy Grail 最短路

2019ICPC 南京网赛 H. Holy Grail

标签

  • 最短路

前言

简明题意

  • 给定一张有向图,现在有6组询问,每次询问给定边u,v,问使得原图不形成负环的最小边权。

思路

  • 其实跟负环没什么关系。给定了u,v,直接输出v,u的最短路就可以了(负的)。然后每次输出后,更新一下原图就行。由于存在负边权,所以应该用spfa。(然而我比赛的时候傻乎乎的用了floyd,竟然也过了)

注意事项

总结

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 300 + 10;

int n, m;
long long g[maxn][maxn];

void floyd()
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) if (i != j)
				g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
void solve()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				g[i][j] = 1e18;
		while (m--)
		{
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			u++, v++;
			g[u][v] = w;
		}

		floyd();

		for (int i = 1; i <= 6; i++)
		{
			int u, v;
			scanf("%d%d", &u, &v);
			u++, v++;
			printf("%d\n", -g[v][u]);
			g[u][v] = -g[v][u];

			for (int k = 1; k <= max(u, v); k++)
				for (int i = 1; i <= n; i++)
					for (int j = 1; j <= n; j++) if (i != j)
						g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
		}
	}
}

int main()
{
	//freopen("Testin.txt", "r", stdin);
	solve();
	return 0;
}
posted @ 2019-09-03 16:05  danzh  阅读(151)  评论(0编辑  收藏  举报