hdu_3631_Shortest Path
来源:互联网 发布:ubuntu 17.04 iso安装 编辑:程序博客网 时间:2024/06/05 09:41
//最短路问题,这里要理解flody算法的过程//如果已经marked的点,可以当做中间结点,求出经过这个中间结点所有的最短路#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN 331#define INF 0x3f3f3f3fint each_dis[MAXN][MAXN], marked[MAXN];int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int vertex, arc, ask, u, v, w, cas(1); while( scanf("%d %d %d", &vertex, &arc, &ask) ) { if( !vertex && !arc && !ask ) { break; } if( 1 != cas ) { printf("\n"); } printf("Case %d:\n", cas ++); for(int i = 0; i < vertex; i ++) { for(int j = 0; j < vertex; j ++) { each_dis[i][j] = INF; } each_dis[i][i] = 0; } for(int i = 0; i < arc; i ++) { scanf("%d %d %d", &u, &v, &w); each_dis[u][v] = min(each_dis[u][v], w); } memset(marked, 0, sizeof(marked)); for(int t = 0; t < ask; t ++) { scanf("%d", &w); if( !w ) { scanf("%d", &u); if( marked[u] ) { printf("ERROR! At point %d\n", u); continue; } marked[u] = 1; for(int i = 0; i < vertex; i ++) { if( INF == each_dis[i][u] ) { continue; } for(int j = 0; j < vertex; j ++) { if( INF == each_dis[u][j] ) { continue; } each_dis[i][j] = min(each_dis[i][j], each_dis[i][u]+each_dis[u][j]); } } } else { scanf("%d %d", &u, &v); if( !marked[u] || !marked[v] ) { printf("ERROR! At path %d to %d\n", u, v); continue; } if( INF == each_dis[u][v] ) { printf("No such path\n"); continue; } printf("%d\n", each_dis[u][v]); } } } return 0;}