hdu 2544 最短路

来源:互联网 发布:网页游戏优化器 编辑:程序博客网 时间:2024/06/16 18:29

本题链接:点击打开链接

本题大意:

        输入n和m,表示有n个点,有m行输入,每行输入两个点和一个距离作为权值,标号1为起点,n为终点。

解题思路:

        此题实际是求两点间最短路径问题,求最短路径的一个算法dijkstra算法(迪科斯彻算法)。

具体请参考代码:

     

#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0xffffffusing namespace std;int map[110][110];//存放两点间距离 int mark[110];//标记使用过的点 int dis[110];//存放各点到起点的最短距离 int n,m;void dijkstra(int s)//迪科斯彻算法{memset(mark,0,sizeof(mark));for(int i=1;i<=n;i++)         dis[i]=INF;//将各点距离初始化为较大的数 dis[s]=0;//起点到起点的距离为0 for(int i=1;i<=n;i++)//对各点进行查找 {int vir,min=INF;for(int j=1;j<=n;j++)//找出距起点最近的点 {if(!mark[j]&&dis[j]<=min){min=dis[j];vir=j;}}if(min==INF)break;mark[vir]=1;//将已找到的点标记 for(int k=1;k<=n;k++)//更新各点到起点集合的距离 if(!mark[k]&&dis[k]>map[vir][k]+dis[vir])dis[k]=map[vir][k]+dis[vir];}}int main(){while(scanf("%d%d",&n,&m),n&&m){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){map[i][j]=INF;//将各点的距离初始化为无穷大 }int x,y,d;for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&d);if(map[x][y]>d)//若有重复,取距离短的 {map[x][y]=d;map[y][x]=d;//无向时,来与往距离相等 }}dijkstra(1);//求以1为起点的迪科斯彻算法 printf("%d\n",dis[n]);//输出终点与起点间最短距离 }return 0;}


 

0 0
原创粉丝点击