[最短路径] HDU 1874 - 畅通工程续

来源:互联网 发布:mac草莓红和番茄红对比 编辑:程序博客网 时间:2024/06/07 06:33

最短路径简单题,用Dijkstra做的。

需要注意的地方:

1、输入中的两点之间的距离,可能存在重边,要选取最小的距离。

2、当S和T相等时,输出0。

#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <set>#include <map>#include <queue>#include <stack>#include <assert.h>#include <time.h>#define Max 200typedef long long LL;const int INF = 500000001;const double EPS = 1e-9;const double PI = acos(-1.0);using namespace std;int graph[Max][Max], vis[Max], dis[Max];int N, M, s, e;void init(){    for(int i = 0; i < N; i++)    {        for(int j = 0; j < N; j++)        {            if(i == j) graph[i][j] = 0;            else graph[i][j] = INF;        }    }}void Dijkstra(){    for(int i = 0; i < N; i++)    {        dis[i] = graph[s][i];        vis[i] = -1;    }    vis[s] = 1;    for(int i = 1; i < N; i++)    {        int minn = INF;        int k = -1;        for(int j = 0; j < N; j++)        {            if(vis[j] == -1 && minn > dis[j])            {                minn = dis[j];                k = j;            }        }        if(k == -1) break;        vis[k] = 1;        for(int j = 0; j < N; j++)        {            if(vis[j] == -1 && dis[k] + graph[k][j] < dis[j])            {                dis[j] = dis[k] + graph[k][j];            }        }    }}int main(){    #ifdef _1Test        freopen("test0.in", "r", stdin);        freopen("test0.out", "w", stdout);        srand(time(NULL));    #endif    int a, b, v;    while(~scanf("%d %d", &N, &M))    {        init();        for(int i = 0; i < M; i++)        {            scanf("%d %d %d", &a, &b, &v);            graph[a][b] = graph[b][a] = min(graph[a][b], v);        }        scanf("%d %d", &s, &e);        Dijkstra();        if(dis[e] == INF) puts("-1");        else printf("%d\n", dis[e]);    }    return 0;}


0 0
原创粉丝点击