标签
前言
简明题意
- 给定一张有向图,现在有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;
}