HDU 2066 最简单的Dijkstra算法实例

来源:互联网 发布:js 上传文件的原理 编辑:程序博客网 时间:2024/06/05 06:00

题目链接:点击打开链接


直接进行一次Dijkstra就行了

#include <stdio.h>#include <string.h>#include <algorithm>#define M 0x3f3f3f3f#define N 1010using namespace std;int map[N][N];int dist[N], pre[N];bool vis[N];int t, s, d;int a, b, tim;int nn, minn;void Dijkstra(int v0){    for(int i = 1; i <= nn; i++)    {        dist[i] = map[v0][i];        vis[i] = false;        if(dist[i] == M)        {            pre[i] = -1;        }        else        {            pre[i] = v0;        }    }    dist[v0] = 0;    vis[v0] = true;    for(int i = 2; i <= nn; i++)    {        minn = M;        int pos = v0;        for(int j = 1; j <= nn; j++)        {            if(!vis[j] && dist[j] < minn)            {                minn = dist[j];                pos = j;            }        }        vis[pos] = true;        for(int j = 1;j <= nn; j++)        {            if(!vis[j] && map[pos][j] < M)            {                if(dist[pos] + map[pos][j] < dist[j])                {                    dist[j] = dist[pos] + map[pos][j];                    pre[j] = pos;                }            }        }    }}int main(){    while(~scanf("%d%d%d", &t, &s, &d))    {        nn = 0;        memset(map, M, sizeof(map));        for(int i = 0; i < t; i++)        {            scanf("%d%d%d", &a, &b, &tim);            nn = max(nn, max(a, b));            map[a][b] = map[b][a] = min(tim, map[a][b]);        }        for(int i = 0; i < s; i++)        {            scanf("%d", &a);            map[0][a] = 0;        }        int m = M;        Dijkstra(0);        for(int i = 0; i < d; i++)        {            scanf("%d", &a);            m = min(m, dist[a]);        }        printf("%d\n", m);    }    return 0;}


0 0
原创粉丝点击