POJ2387 Dijkstra

题意

输入两个数字,第一个数字为m,代表边的个数,第二个数字为n,代表点的个数,输入m条边,求最短路

题解

Dijkstra模板题。N次循环,每次循环挑选距离起始点最短且未访问的点,然后更新与此点有关的所有未访问的点到起始点的距离。N次循环后,便可得出起始点到任意一点的最短距离。

注意事项

此题要注意重边的情况,需要在边输入时,对重边进行过滤。还要注意,第一个数字为m,代表边的个数,第二个才是n,代表点的个数。

代码
#include <iostream>
#include<cstdio>
#include<algorithm>
#define MAX_N 1010
#define MAX_M 2010
#define INF 1e9

using namespace std;

int d[MAX_N];
bool visited[MAX_N];
int w[MAX_M][MAX_M];
int n,m;

void dijkstra(int s){
    for(int i=1;i<=n;i++)
        d[i]=INF;
    d[s]=0;
    for(int i=0;i<n;i++){
        int x=0,maxx=-1;
        for(int j=1;j<=n;j++){
            if(!visited[j]&&(maxx==-1||maxx>d[j])){
                maxx=d[x=j];
            }
        }
        visited[x]=true;
        for(int j=1;j<=n;j++){
            if(!visited[j]){
                d[j]=min(d[x]+w[x][j],d[j]);
            }
        }
    }
}

int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            w[i][j]=INF;
        }
    }
    for(int i=0;i<m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(w[a][b]>c)
            w[a][b]=w[b][a]=c;
    }
    dijkstra(1);
    printf("%d\n",d[n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值