hdu_2544 最短路

来源:互联网 发布:国信期货软件 编辑:程序博客网 时间:2024/06/14 01:35

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

分析:最短路径的入门题,主要理解dijstra算法中dis[i](从源点到i点的最短路径)的更新。还要用到S集合(已找过的点)和G(总的点),G-S(未找的点)。

           主要分三步来更新dis数组:

           1、在S集合中找一个到G-S集合中的点最近的点D。

           2、D点能到的点为K点,更新dis[K]的值。

           3、将D点放进S集合,当所有点都在S集合时,dis数组中九存放着从源点到个点的最短路径。

我的代码:

#include<stdio.h>#include<string.h>using namespace std;#define INF 0xffffff#define MAXN 120int map[MAXN][MAXN];int dis[MAXN];int mark[MAXN];void init(int n){    int i,j;    for( i=1;i<=n;i++)        for(j=1;j<=n;j++) map[i][j]=INF;}int Min(int a,int b){    return a<b?a:b;}void dijstra(int n,int s){    for(int i=1;i<=n;i++)    {        dis[i]=map[s][i];  //初始化dis[]数组。        mark[i]=0;    }    dis[s]=0;    mark[s]=1;    for(int i=1;i<=n;i++)  //每次加一个点,要加的点数。    {        int k,min=INF;        for(int j=1;j<=n;j++) //找到不在S集合点,且S集合的点到其他集合点的最小值。        {            if(!mark[j]&&dis[j]<min)            {                min=dis[j];                k=j;            }        }        if(min==INF) break;//即所有点都在S集合里了。        mark[k]=1;        for(int j=1;j<=n;j++)        {            if(!mark[j]&& map[k][j]!=INF) //map[u][j],要是连通的。            {                dis[j]=Min(dis[j],dis[k]+map[k][j]);            }        }    }}int main(){    int  i,n,m;    while(scanf("%d%d",&n,&m)==2&&(n+m))    {        init(n);        for(i=0;i<m;i++)  //输入图。        {            int a,b,t;            scanf("%d%d%d",&a,&b,&t);            map[a][b]=t;            map[b][a]=t;        }        dijstra( n,1);        printf("%d\n",dis[n]);    }    return 0;}

总结:用dijstra求最短路径。关于最短路径,又研究了一个下午-,-还是有点收获的。。


           

原创粉丝点击