POJ2387 简单的Dijkstra入门

来源:互联网 发布:沙宝亮 知乎 编辑:程序博客网 时间:2024/06/05 16:42

题意

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

题解

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

注意事项

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

代码

#include <iostream>#include<cstdio>#include<algorithm>#define MAX_N 1010#define MAX_M 2010#define INF 1e9using 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;}
0 0
原创粉丝点击