最短路 - Dijkstra()

来源:互联网 发布:42u图腾网络机柜尺寸 编辑:程序博客网 时间:2024/05/22 00:50

http://acm.nyist.net/JudgeOnline/problem.php?pid=115

#include <stdio.h>#include <string.h>#include <iostream>#include <stdlib.h>#define inf 0x3f3f3f3f#define N 1005using namespace std;int d[N], G[N][N], vis[N], city[101];int m, n, p, q;void dijkstra(int v){    int i, j, minn, k;    for (i = 1; i <= m; i++)        d[i] = G[v][i];    memset(vis, 0, sizeof(vis));    vis[v] = 1;    d[v] = 0;    for (i = 1; i <= m; i++)    {        minn = inf;        k = v;        for (j = 1; j <= m; j++)        {            if (!vis[j] && d[j] < minn)            {                k = j;                minn = d[j];            }        }        if (minn == inf)          break;        vis[k] = 1;        for (j = 1; j <= m; j++)        {            if (!vis[j] && minn + G[k][j] < d[j])                d[j] = G[k][j] + d[k];        }    }}int main(){    int T, i, j;    int a, b, c;    int temp;    scanf("%d", &T);    while (T--)    {        temp = inf;        for (i = 0; i < N; i++)            for (j = 0; j < N; j++)                G[i][j] = inf;        scanf("%d%d%d%d", &n, &m, &p, &q);        for (i = 1; i <= n; i++)            scanf("%d", city + i);        while (p--)        {            scanf("%d%d%d", &a, &b, &c);            if (G[a][b] > c)                G[a][b] = G[b][a] = c;        }       dijkstra(q);        for (i = 1; i <= n; i++)           if (temp > d[city[i]])               temp = d[city[i]];        printf("%d\n", temp);    }    return 0;}
0 0
原创粉丝点击