课程设计 最小时间 最短路径 模板 .
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);
}
}
有多个城市组成一个铁路交通网络。任意两个城市之间有直连铁路,或者通过其他城市间接到达。给定某个城市,要求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);
}
}
相关文章推荐
- 课程设计 最小时间 最短路径 模板 .
- 课程设计 最小时间 最短路径 模板 .
- 课程设计 最小时间 最短路径 模板 .
- 课程设计 最小时间 最短路径 模板 .
- 课程设计 最小时间 最短路径 模板 .
- 课程设计 最小时间 最短路径 模板 .
- 算法分析与设计课程设计-Dijkstra最短路径算法
- 最短路径-弗洛伊德算法(第一次课程设计)
- 图的最短路径及最小生成树 模板
- 【课程设计报告】题目0:设计校园两点之间的最小单元路径
- 数据结构课程设计:两顶点之间最短路径
- hdu 5294 Tricks Device (最小割+最短路径+Dinic模板)
- 多源最短路径Floyd、Floyd求最小环【模板】
- 多源最短路径Floyd、Floyd求最小环【模板】
- 时间复杂度最小的最短路径算法?由这个想到的
- 数据结构课程设计——图的建立和遍历(邻接矩阵+邻接表)和最短路径dijkstra路径记录
- 最小生成树(Prime算法、Kruskal算法)和最短路径算法(Floyd算法、DijKstra算法)
- HDU1385Minimum Transport Cost(两点间最短spfa+输出字典树最小的路径)
- 求最小生成树和最短路径的总结
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)