题意:好难懂 看了别人题解才知道; 翻了好几页百度 所以我决定写一个能让大家明白的题解
第一行:一个数T 表示有几台处理器(第一台处理器要给其他处理器发消息)
第二行:给你一个倒三角 就是A(i,j)就是i到j之间的距离 当然本身到本身的距离肯定为0 ij都为1是本身所以第一个不用输入 ,又因为道路是双向的 所以 只给一半倒三角 如果是X表示道路不通(设置为INF) 就是在矩阵中查询最短路
让你求最小的消耗时间
思路:dijkstra算法:求出第一个处理器到其他处理器之间的最小消耗 然后找出其中最大的 就是这个消息传递的最小消耗
用到的知识点:atof()将字符串转换成浮点数
atoi()将字符串转换成整数
atol()字符串转换成长整数
strtod().....双精度
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
#define maxn 150
using namespace std;
int map[maxn][maxn];
int d[maxn];
bool vis[maxn];
char ch[15];
int T;
void dijkstra()
{
memset(vis,0,sizeof(vis));
for(int i = 1; i <= T; i ++)
{
d[i] = map[1][i];
}
for(int i = 1; i <= T; i++)
{
int temp = -1;
for(int j = 1; j <= T; j ++)
{
if(!vis[j] && (temp == -1 || d[j] < d[temp]))
temp = j;
}
vis[temp] = 1;
for(int j = 1; j <= T; j++)
{
if(!vis[j] && d[j] > d[temp] + map[temp][j])
d[j] = d[temp] + map[temp][j];
}
}
}
int main()
{
scanf("%d",&T);
//memset(map,0,sizeof(map));
for(int i = 1; i <= T; i++)
map[i][i] = 0;
for(int i = 2; i <= T; i ++)
for(int j = 1; j <= i - 1; j ++)
{
scanf("%s",ch);
if(ch[0] == 'x')
map[i][j] = map[j][i] = INF;
else map[i][j] = map[j][i] = atoi(ch);
}
dijkstra();
int max = -1;
for(int k = 1; k <= T; k ++)
{
if(max == -1 || d[k] > max)
max = d[k];
}
printf("%d\n",max);
return 0;
}