最短路 执行一遍 Floyd算法 比赛的时候没有想到, 用了优化的Dijkstra 超时到死
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 1000000000
using namespace std;
int g[310][310];
bool flag[310];
int main()
{
// freopen("d:/in.txt", "r", stdin);
int n, m, k, ca = 1;
while (scanf("%d%d%d", &n, &m, &k) == 3 && n + m + k)
{
if (ca > 1)
puts("");
printf("Case %d:\n", ca++);
memset(flag, false, sizeof(flag));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (i == j) g[i][j] = 0;
else g[i][j] = INF;
for (int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
if (g[u][v] > w)
g[u][v] = w;
}
for (int i = 0; i < k; i++)
{
int c;
scanf("%d", &c);
if (c)
{
int u, v;
scanf("%d%d", &u, &v);
if (!flag[u] || !flag[v])
printf("ERROR! At path %d to %d\n", u, v);
else if (g[u][v] == INF)
puts("No such path");
else
printf("%d\n", g[u][v]);
}
else
{
int u;
scanf("%d", &u);
if (flag[u])
printf("ERROR! At point %d\n", u);
else
{
flag[u] = true;
for (int j = 0; j < n; j++)
for (int o = 0; o < n; o++)
g[j][o] = min(g[j][o], g[j][u] + g[u][o]);
}
}
}
}
}