hdu 1874 畅通工程续(迪科斯彻算法)
2015-08-17 20:30
357 查看
本题链接:点击打开链接
本题大意:
n个村庄,m组数据,村庄标号为0--(n-1),每组数据输入两个点及距离作为权值,然后输入起点和终点,求最短距离。
解题思路:
基本的dijkstra算法使用。具体请参见代码:
本题大意:
n个村庄,m组数据,村庄标号为0--(n-1),每组数据输入两个点及距离作为权值,然后输入起点和终点,求最短距离。
解题思路:
基本的dijkstra算法使用。具体请参见代码:
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f int map[1010][1010];//存放两点间距离 int mark[1010];//标记使用过的点 int dis[1010];//存放各点到起始点的最短距离 int n,m,s,e; int dijkstra()//迪科斯彻算法 { memset(mark,0,sizeof(mark)); for(int i=0;i<n;i++)//将各点距离初始化为较大的数 dis[i]=INF; dis[s]=0; for(int i=0;i<n;i++)//对各点进行查找 { int vir,min=INF; for(int j=0;j<n;j++)//查找距离起点最近的点 { if(min>dis[j]&&!mark[j]) { min=dis[j]; vir=j; } } if(min==INF) break; mark[vir]=1;//将已查找过的点做标记 for(int j=0;j<n;j++)//更新各点到起始点区间的距离 if(!mark[j]&&dis[j]>dis[vir]+map[vir][j]) dis[j]=dis[vir]+map[vir][j]; } if(dis[e]==INF)//若终点距离仍为初始化距离,说明查找不到此点,即不存在到此点的路径 return -1; else return dis[e]; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=INF; int x,y,d; for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&d); if(map[x][y]>d) { map[x][y]=d; map[y][x]=d; } } scanf("%d%d",&s,&e); printf("%d\n",dijkstra()); } return 0; }
相关文章推荐
- Android:Unable to resolve target ‘android-8’问题解决
- c# ComboBox简单用法
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- nginx log format
- 全排列算法—基于OC
- UMeng 微博分享,报invalid_client 和 redirect_uri_mismatch
- 关于Linealayout 各item点击效果,比较不错的selector
- 1095
- poj2454--Jersey Politics(随机化算法)
- hdu 1258 Sum It Up
- Codeforces Round #274 (Div. 2) d Long Jumps 尺取法 + set
- Sublime Text Editor Recommended Settings
- [Leetcode] Surrounded Regions
- jquery---基本标签
- Android 历史 基本框架
- POJ-1258Agri-Net
- Squence 设置主键自动增长,设置起始值、步长
- 解密SVM系列(四):SVM非线性分类原理实验
- Delphi开发学习二:使用ADOQuery控件对SQL数据库表进行操作
- [HNOI2011][BZOJ2326] 数学作业|动态规划|矩阵乘法|快速乘