/*此题就是为floyd而设,题目每次明确对一个顶点松弛,最后所求是全局最短路,因此每次只需
对一个顶点进行floyd算法,另外注意顶点标号是从0开始*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 305
#define INF 0x3f3f3f3f
using namespace std;
int m, n, q;
int map[N][N];
int vis[N];
void init()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
}
void creatgraph()
{
int t1, t2, t3;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &t1, &t2, &t3);//两个顶点和权值
if (map[t1][t2] > t3)//防止出现多次输入相同的两点,取最小值****一定注意
map[t1][t2] = t3;//有向图
}
}
void floyd(int k)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (map[i][k] < INF && map[k][j] < INF)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}
}
}
int main()
{
int cas = 0;
while (scanf("%d%d%d", &n, &m, &q) != EOF && (n || m || q))//n个顶点,m条边
{
if (cas != 0) printf("\n");
printf("Case %d:\n", ++cas);
init();//初始化地图
memset(vis, 0, sizeof(vis));
creatgraph();//建图
for (int i = 0; i < q; i++)
{
int type;
scanf("%d", &type);
if (!type)
{
int v;
scanf("%d", &v);
if (vis[v])
printf("ERROR! At point %d\n", v);
else
{
floyd(v);//对顶点v进行松弛
vis[v] = 1;//标记顶点v已松弛
}
}
else
{
int x, y;
scanf("%d%d", &x, &y);
if (!vis[x] || !vis[y])//x,y均未被标记
printf("ERROR! At path %d to %d\n", x, y);
else if (map[x][y] >= INF)//y不可达
printf("No such path\n");
else printf("%d\n", map[x][y]);
}
}
}
return 0;
}
hdu3790 单点floyd松弛
最新推荐文章于 2022-08-10 07:37:28 发布