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所在的城市和要去的城市
其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
0.500 0.400 0.500
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define INF 0x3f3f3f3f
double 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");
}
}
}
河南省第九届程序设计竞赛的信道安全因为数据太大,用狄克斯特拉算法是行不通的。