题意:有n个点,然后有一个矩阵为左下矩阵,A[i, j] = A[j, i] = k表示i到j的距离是k,路径是双向的。然后输出从点1出发达到所有顶点的最短路长度中最大的那个。
想法:单源最短路,加上图中直接给出了矩阵,中规中矩的Dijkstra模板,主要是在证明算法正确性之后,很好的去理解算法的过程,和具体步骤的含义。用到一个atoi函数,表示将ACSII转化为int,用到的头文件#include<algorithm> using namespace std;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf = 100000; int map[111][111]; int n; int dis[111]; void Dijkstra(int source) { bool visit[111]; memset(visit, false, sizeof(visit)); for(int i = 1; i <= n; ++i){ dis[i] = map[source][i]; } dis[source] = 0; visit[source] = true; for(int k = 1; k <= n - 1; ++k){ int pick_min = inf; int pos; for(int i = 1; i <= n; ++i){ if(!visit[i] && pick_min > dis[i]){ pick_min = dis[i]; pos = i; } } visit[pos] = true; for(int i = 1; i <= n; ++i){ if(!visit[i] && dis[i] > dis[pos] + map[pos][i]){ dis[i] = dis[pos] + map[pos][i]; } } } } int main() { while(~scanf("%d", &n)) { memset(map, 0, sizeof(map)); for(int i = 1; i <= n; ++i){ for(int j = 1; j < i; ++j){ char in_char[5]; scanf("%s", in_char); if(in_char[0] != 'x'){ map[i][j] =map[j][i] = atoi(in_char); } else map[i][j] = map[j][i] = inf; } } Dijkstra(1); int max_ans = -1; for(int i = 2; i <= n; ++i){ if(max_ans < dis[i]){ max_ans = dis[i]; } } printf("%d\n", max_ans); } return 0; }