//单源最短路。最后答案应该处从起点到其他结点最短路中的最大值。 #include<iostream> #include<queue> using namespace std; const int INF = 50000000; int G[105][105]; bool flag[105]; int dis[105]; int n; int dijkstra(int st) { int res = INF*(-1); for(int i = 0;i < n;i++) dis[i] = (i == st ? 0 : INF);//初始化 memset(flag,0,sizeof(flag)); for(int i = 0;i < n;i++) { int x,_min = INF; for(int y = 0;y < n;++y) { if(!flag[y] && dis[y] < _min)//找出没标号结点中的最小值 _min = dis[x = y]; } flag[x] = 1;//标号 for(int y = 0;y < n;++y) { dis[y] = min(dis[y],dis[x] + G[x][y]);//从标号结点出发对其他所有点进行松弛操作 } } for(int i = st + 1;i < n;++i) if(dis[i] > res) res = dis[i];//找出单源最短路中的最大值 return res; } int main() { freopen("in.txt","r",stdin); char d[100]; scanf("%d",&n); memset(G,0,sizeof(G)); for(int i = 1;i < n;++i) { for(int j = 0;j < i;j++) { scanf("%s",d); if(d[0] != 'x') { G[i][j] = atoi(d); G[j][i] = atoi(d);//利用atoi函数将char*转化为int } else { G[i][j] = INF; G[j][i] = INF; } } } printf("%d/n",dijkstra(0)); return 0; }