您的位置:首页 > 理论基础 > 数据结构算法

课程设计 最小时间 最短路径 模板 .

2017-12-15 14:39 423 查看
题目描述

  有多个城市组成一个铁路交通网络。任意两个城市之间有直连铁路,或者通过其他城市间接到达。给定某个城市,要求M时间内能到达任意指定的另一城市,求最小的M。

输入

每个测试用例由多行组成,第一行是整数n(1 <= n <= 100),表示城市的数目。

其余行表示邻接矩阵A。A(i,j)的值如果是一个整数t,表示城市i与城市j有铁路直连,需要t时间到达另一方。如果A(i,j)的值为x,表明城市i与城市j之间没有直连铁路。很明显有A(i,i) = 0。

由于对称关系和A(i,i) 为 0,输入只给出矩阵的下三角。第一行A(1,1)在输入中省略,第二行只有A(2,1),下一行则是A(3,1) 和A(3,2),依此类推。

输出

输出城市1所对应的最小M。

样例输入

5

50

30 5

100 20 50

10 x x 10

样例输出
35

思路:最短路径模板题目,这个题目采用迪杰斯特拉算法就可以,模板题目,但是坑了我4个小时,学校的机房电脑有毒,以后再遇到这种思路没有问题的题目时,毁了之前的代码从新写一遍即可,听同学说这个题目卡时间不多,用弗洛伊德也可以O(N^3),对数据比较大的题目就不是很方便了。

include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 200
#define INF 10000 //对本题来说一个很大的数字
int s
; //是否找到到i的最短路径
int Path
; //记录从源点到终点vi的最短路径上的直接前驱顶点
int D
; //1到i的最短路径长度
int a

; //i--j或者 j--i的路径长度
int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=a[j][i]=INF;
}
char c[20];
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
{ scanf("%s",c);
if(c[0]!='x')
{
int len=strlen(c),sum=0;
for(int k=0;k<len;k++)
sum=sum*10+(int)(c[k]-'0');
a[i][j]=sum,a[j][i]=sum;
}
}
//初始化完成
for(int v=1;v<=n;v++){
s[v]=0;
D[v]=a[1][v];
if(D[v]<INF) Path[v]=1;
else Path[v]=1;
}
s[1]=1;
D[1]=0;
int imin,v;
for(int i=2;i<=n;i++)
{
imin=INF;
for(int w=1;w<=n;w++)
if(!s[w]&&D[w]<imin)
{ v=w;imin=D[w];}
s[v]=1;
for(int w=1;w<=n;w++)
if(!s[w]&&(D[v]+a[v][w]<D[w]))
{
D[w]=D[v]+a[v][w];
Path[w]=v;
}
}
int ans=-1;
for(int i=2;i<=n;i++){
if(ans<=D[i])
ans=D[i];
}
printf("%d\n",ans);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息