畅通工程续(dijkstra)

来源:互联网 发布:linux系统安装步骤 编辑:程序博客网 时间:2024/06/05 08:44

题意:求任意两个点之间的最短路径。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>using namespace std;const int INF = 1e5;int road[220][1100];bool vis[220];int cost[220];int n,m;void dij(int x){    memset(vis, false,sizeof vis);    for(int i=0; i<n; i++)        cost[i] = road[x][i];    cost[x] = 0;    vis[x] = 1;    for(int i=0; i<n; i++)    {        int temp = INF, k;        for(int j=0; j<n; j++)        {            if(!vis[j] && temp > cost[j])            {                temp = cost[j];                k = j;            }        }        vis[k] = true;        if(temp == INF) break;        for(int l=0; l<n; l++)        {            if(!vis[l])            {                cost[l] = min(cost[l],cost[k] + road[k][l]);            }        }    }}int main(){    while(cin >> n >> m)    {        int a, b, c;        for(int i=0; i<n; i++)            fill(road[i], road[i]+n, INF);        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            if(road[a][b] > c)                road[a][b] = road[b][a] = c;        }        int start,end1;        cin >>start >> end1;        dij(start);        if(cost[end1] == INF)            cout << "-1" << endl;        else            cout << cost[end1] << endl;    }    return 0;}
0 0
原创粉丝点击