图论之Dijkstra
来源:互联网 发布:电信宽带加端口要多久 编辑:程序博客网 时间:2024/05/20 16:39
Dijkstra模板:
#include<stdio.h>
#include<string.h>
#define INF 0x11111111
int map[1010][1010];
int way[1010],flag[1010];
int dij(int n)
{
for(int i=1;i<=n;i++)//开始赋值
{
way[i]=map[1][i];
}
for(int i=1;i<n;i++)
{
int min=INF;
int k=0;
for(int j=1;j<=n;j++)//找出一个距离起点最近的路径
{
if(flag[j]==0&&way[j]<min)
{
min=way[j];
k=j;
}
}
flag[k]=1;
for(int j=1;j<=n;j++)//找出距离刚刚选出来的点最近的距离组成新的路径
{
if(flag[j]==0&&way[k]+map[k][j]<way[j])
{
way[j]=way[k]+map[k][j];
}
}
}
}
int main()
{
intn,m,x,y,z,v,s,t;
while(scanf("%d %d",&n,&m),n!=0&&m!=0)
{
memset(map,INF,sizeof(map));//数组初始化为最大值
memset(way,INF,sizeof(way));//此数组储存从s到i的长度
memset(flag,0,sizeof(flag));//标记路径点是否被加入最短路径中
flag[1]=1;//起点已经被标记为加入最短路径
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&x,&y,&z);
map[x][y]=z;//储存正反向的路径长度和花费
map[y][x]=z;
}
dij(n);
printf("%d\n",way[n]);
}
return 0;
}
find the safest road
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12647 Accepted Submission(s): 4493
第一行:n。n表示城市的个数n<=1000;
接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道)
接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市
其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
31 0.5 0.50.5 1 0.40.5 0.4 131 22 31 3
0.5000.4000.500
#include<iostream>#include<math.h>#include<stdio.h>#include<string.h>using namespace std;#define INF 0x3f3f3f3fdouble map[1010][1010];double way[1010],flag[1010];int n;void dij(int x,int y){ for(int i=1; i<=n; i++)//开始赋值 { way[i]=map[x][i]; } for(int i=1; i<n; i++) { int k=0; double maxx=-INF; for(int j=1; j<=n; j++)//找出一个距离起点最近的路径 { if(flag[j]==0&&way[j]>maxx) { maxx=way[j]; k=j; } } flag[k]=1; for(int j=1; j<=n; j++)//(以后每考虑一个新的中间点,way[j]的值可能被修改变大) { if(flag[j]==0&&way[k]*map[k][j]>way[j]) way[j]=way[k]*map[k][j]; } }}int main(){ int m,a,b; while(~scanf("%d",&n)) { memset(map,0,sizeof(map)); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%lf",&map[i][j]); scanf("%d",&m); while(m--) { memset(way,INF,sizeof(way));//用来保存从源点v到顶点i的目前最短路径长度 memset(flag,0,sizeof(flag));//标记路径点是否被加入最短路径中 scanf("%d%d",&a,&b); dij(a,b); if(way[b]!=0) printf("%.3lf\n",way[b]); else printf("What a pity!\n"); } }}河南省第九届程序设计竞赛的信道安全因为数据太大,用狄克斯特拉算法是行不通的。
- 图论之Dijkstra
- 图论之dijkstra
- 图论之Dijkstra
- 图论之Dijkstra算法求最短路径
- 图论浅析--最短路之Dijkstra
- 图之Dijkstra算法
- 图之Dijkstra算法
- 图论入门之-----最短路之dijkstra 算法
- 图论之最短路径-------Dijkstra算法
- 图论算法之最短路径(Dijkstra算法)
- 图论算法-Dijkstra
- c++之图的Dijkstra算法!
- 图算法之bfs、dfs、prim、Dijkstra
- 重学数据结构系列之——图论算法之Dijkstra算法
- 图论基本算法2之最小生成树(Dijkstra算法)
- 最短路之dijkstra
- 贪心算法之Dijkstra
- 最短路之Dijkstra
- PyQt4原始例程--下拉菜单可供选择并打印出来
- 4.28 JEE实习日记
- Python 迭代器
- 霍金GMIC演讲:AI或终结人类文明
- 我的sql效率提升经验+取经
- 图论之Dijkstra
- 技术转型产品学习工具收集与整理——第十天
- [LeetCode]123. Best Time to Buy and Sell Stock III
- Linux:使用libgen.h:basename,dirname
- MXNet
- 编程杂感两篇
- centos 7安装glusterfs 3.10
- oracle 找不到监听 lister 有问题??进来看看吧
- linux服务器下配置Jdk和Tomcat