hdu3790最短路径
来源:互联网 发布:ones刻录软件 编辑:程序博客网 时间:2024/05/14 15:51
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int M = 1005;const int MAX = 0x7fffffff;int dp[M][M];int cont[M][M];int vist[M];int dir[M];int value[M];int n, m;void init() { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { dp[i][j] = MAX; cont[i][j] = MAX; } }}void dijkstra(int u) { int index; for(int i = 1; i <= n; i++) { dir[i] = dp[u][i]; value[i] = cont[u][i]; vist[i] = 0; } vist[u] = 1; dir[u] = 0; value [u] = 0; for(int i = 1; i <= n; i++) { int minn = MAX; for(int j = 1; j <= n; j++) { if(!vist[j] && dir[j] < minn) { minn = dir[j]; index = j; } } if(minn == MAX) break; vist[index] = 1; for(int k = 1; k <= n; k++) { if(!vist[k] &&dp[index][k] < MAX ) { if(dir[k] > dir[index] + dp[index][k]) { dir[k] = dir[index] + dp[index][k]; value[k] = value[index] + cont[index][k]; } else if(dir[k] == dir[index] + dp[index][k]) { if(value[k] > value[index] + cont[index][k]) { value[k] = value[index] + cont[index][k]; } } } } }}int main(){ int a, b, c, d; int s, e; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; init(); for(int i = 1; i <= m; i++) { scanf("%d%d%d%d", &a, &b, &c, &d); if(dp[a][b] > c) { dp[a][b] = dp[b][a] = c; cont[a][b] = cont[b][a] = d; } else if(dp[a][b] == c) { if(cont[a][b] > d) { cont[a][b] = cont[b][a] = d; } } } scanf("%d%d", &s, &e); dijkstra(s); printf("%d %d\n", dir[e], value[e]); } return 0;}