求这种“网状”传播的最短时间的起点,实际就是找出那个 到离自己最远顶点所用时间最短的顶点。还是水题...应该用Dijkstra比较好,不小心看错题目了,用了Floyd。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int INF = 0x3f3f3f3f;
int G[101][101];
int Floyd(int n){
int max;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[i][k] + G[k][j];
max = 0;
for(int j=1;j<=n;j++)
if(G[1][j] > max)
max = G[1][j];
return max;
}
int Get(){
char s[5], c, x[]="x";
int m, count = 0;
scanf("%c", &c);
if(c == ' ' || c == '\n')
scanf("%c", &c);
while(c!=' ' && c!='\n'){
s[count++] = c;
scanf("%c", &c);
}
s[count] = '\0';
if(strcmp(s, x) != 0)
m = atoi(s);
else
m = 'x';
return m;
}
void Read(int n){
int m;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++){
m = Get();
if(m != 'x')
G[i][j] = G[j][i] = m;
else
G[i][j] = G[j][i] = INF;
}
}
int main(){
int N, min;
char s, tmp;
scanf("%d", &N);
for(int i=1;i<=N;i++)
G[i][i] = 0;
Read(N);
min = Floyd(N);
printf("%d", min);
return 0;
}