hdu3790 单点floyd松弛

来源:互联网 发布:淘宝可以卖杂货吗 编辑:程序博客网 时间:2024/04/27 19:08
/*此题就是为floyd而设,题目每次明确对一个顶点松弛,最后所求是全局最短路,因此每次只需对一个顶点进行floyd算法,另外注意顶点标号是从0开始*/#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#define N 305#define INF 0x3f3f3f3fusing 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;}

0 0
原创粉丝点击