Input The input will describe the topology of a network connecting n processors. The first line of the input will be n, the number of processors, such that 1 <= n <= 100.
The rest of the input defines an adjacency matrix, A. The adjacency matrix is square and of size n x n. Each of its entries will be either an integer or the character x. The value of A(i,j) indicates the expense of sending a message directly from node i to node j. A value of x for A(i,j) indicates that a message cannot be sent directly from node i to node j. Note that for a node to send a message to itself does not require network communication, so A(i,i) = 0 for 1 <= i <= n. Also, you may assume that the network is undirected (messages can go in either direction with equal overhead), so that A(i,j) = A(j,i). Thus only the entries on the (strictly) lower triangular portion of A will be supplied. The input to your program will be the lower triangular section of A. That is, the second line of input will contain one entry, A(2,1). The next line will contain two entries, A(3,1) and A(3,2), and so on.Output Your program should output the minimum communication time required to broadcast a message from the first processor to all the other processors. Sample Input
5 50 30 5 100 20 50 10 x x 10Sample Output
35本题是一个典型的最短路问题,题目给出的是各个点关系的矩阵,因为到本身为零,且 是无向图,所以给出了一半的矩阵。
#include<stdio.h> #include <string.h> #include<algorithm> #define INF 9999999 int map[110][110],n; void dijkstra() { int i,j,ans=-1,min,v; //dijkstra算法核心 int dis[110],book[110]; for(i=1;i<=n;i++)//找出从原点到各个点之间的距离 { dis[i]=map[1][i]; book[i]=0; } book[1]=1; for(i=1;i<=n;i++) { min=INF; for(j=1;j<=n;j++) { if(book[j]==0 && dis[j]<min)//找出未标记的且原点到该点的最小距离 { min=dis[j]; v=j; } } book[v]=1;//标记该点 for(j=1;j<=n;j++) if(book[j]==0 && dis[v]+map[v][j]<dis[j])//找出更小的距离并更新dis数组 dis[j]=dis[v]+map[v][j]; } for(i=2;i<=n;i++) if(dis[i]>ans)//用时最长的那个点就是传递完信息所用的时间 ans=dis[i]; printf("%d\n",ans); } int main() { char s[10]; int i,j; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++)//初始化map矩阵 for(j=1;j<=n;j++) if(i==j) map[i][j]=0; else map[i][j]=INF; for(i=2;i<=n;i++)//因为可能有 X 所以要以字符串的形式输入每一个值 for(j=1;j<i;j++) { scanf("%s",s); if(s[0]!='x') map[i][j]=map[j][i]=atoi(s);//C++头文件,将字符串转化为整数 } dijkstra(); } return 0; }