问题 S: 最小时间
时间限制: 1 Sec 内存限制: 128 MB
提交: 484 解决: 168
[提交][状态][讨论版]
题目描述
有多个城市组成一个铁路交通网络。任意两个城市之间有直连铁路,或者通过其他城市间接到达。给定某个城市,要求在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
迪杰斯特拉算法,代码如下:
#include<stdio.h>
#define MAX 100
#define INF 1e7
#define x 1000
typedef struct _graph
{
int vexs[MAX]; // 顶点集合
int vexnum; // 顶点数
int edgnum; // 边数
int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph;
void dijkstra(Graph G)
{
int i,j,k;
int min;
int vs=0;
int tmp;
int dist[MAX];
int flag[MAX]; // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。
// 初始化
for (i = 0; i < G.vexnum; i++)
{
flag[i] = 0; // 顶点i的最短路径还没获取到。
//prev[i] = 0; // 顶点i的前驱顶点为0。
dist[i] = G.matrix[vs][i];// 顶点i的最短路径为"顶点vs"到"顶点i"的权。
}
// 对"顶点vs"自身进行初始化
flag[vs] = 1;
dist[vs] = 0;
// 遍历G.vexnum-1次;每次找出一个顶点的最短路径。
for (i = 1; i < G.vexnum; i++)
{
// 寻找当前最小的路径;
// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。
min = INF;
for (j = 0; j < G.vexnum; j++)
{
if (flag[j]==0 && dist[j]<min)
{
min = dist[j];
k = j;
}
}
// 标记"顶点k"为已经获取到最短路径
flag[k] = 1;
// 修正当前最短路径和前驱顶点
// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
for (j = 0; j < G.vexnum; j++)
{
tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出
if (flag[j] == 0 && (tmp < dist[j]) )
{
dist[j] = tmp;
//prev[j] = k;
}
}
}
// 打印dijkstra最短路径的结果
//printf("dijkstra(%d): \n", G.vexs[vs]);
int max=-1;
for (i = 0; i < G.vexnum; i++)
if(dist[i]>max&&i!=vs)
max=dist[i];
printf("%d\n",max);
}
int change(char a[])
{
int i,sum=0;
for(i=0;a[i]!='\0';i++)
{
sum=sum*10+a[i]-'0';
}
return sum;
}
int main()
{
int n,i,j;
char a[1000];
Graph G;
while(~scanf("%d",&n))
{
G.vexnum=n;
for(i=0;i<n;i++)
G.matrix[i][i]=0;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{scanf("%s",&a);
if(a[0]!='x')
G.matrix[i][j]=change(a);
else
G.matrix[i][j]=x;
G.matrix[j][i]=G.matrix[i][j];}
/*for(i=0;i<n;i++)
{for(j=0;j<=i;j++)
printf("%d ",G.matrix[i][j]);
printf("\n");
}*/
dijkstra(G);
}
}