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;}