- 题目地址
- 题目解析:非常典型的多源最短路径题目
- 我的代码:
1、Dijkstra算法
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int n, m, aa[101][101];
void reader(void)
{
scanf("%d %d", &n, &m);
memset(aa, 0x3f, sizeof(aa));
for (int i = 1; i <= n; i++)
aa[i][i] = 0;
for (int i = 0, a, b, c; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
aa[a][b] = c, aa[b][a] = c;
}
return;
}
int dijkstra(int s);
int main()
{
reader();
int minOfMax = INF, id = 0;
for (int i = 1, val; i <= n; i++)
{
val = dijkstra(i);
if (val < minOfMax)
minOfMax = val, id = i;
}
if (id) printf("%d %d", id, minOfMax);
else printf("%d", 0);
return 0;
}
int dijkstra(int s)
{
int dist[101], mark[101] = { 0 };
for (int i = 1; i <= n; i++)
dist[i] = aa[s][i];
mark[s] = 1;
int count = 1, max = 0;
while (1)
{
int curMin = INF, curI = 0;
for (int i = 1; i <= n; i++)
if (!mark[i] && dist[i] < curMin)
curMin = dist[i], curI = i;
if (!curI) break;
mark[curI] = 1, count++;
for (int i = 1, val; i <= n; i++)
if (!mark[i] && aa[curI][i] < INF)
{
val = dist[curI] + aa[curI][i];
if (val < dist[i])
dist[i] = val;
}
if (dist[curI] > max)
max = dist[curI];
}
if (count == n && max != 0)
return max;
return INF;
}
2、Floyd算法
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define MIN(a,b) a<b?a:b;
int main()
{
int n, m, aa[101][101];
scanf("%d %d", &n, &m);
memset(aa, 0x3f, sizeof(aa));
for (int i = 1; i <= n; i++)
aa[i][i] = 0;
for (int i = 0, a, b, c; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
aa[a][b] = c, aa[b][a] = c;
}
int minOfMax = INF, id = 0;
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
if (k != n)
{
for (int j = 1; j <= n; j++)
aa[i][j] = MIN(aa[i][j], aa[i][k] + aa[k][j]);
}
else
{
int flag = 0, max = 0;
for (int j = 1; j <= n; j++)
{
aa[i][j] = MIN(aa[i][j], aa[i][k] + aa[k][j]);
if (aa[i][j] > max)
max = aa[i][j];
}
if (max < minOfMax && !flag)
minOfMax = max, id = i;
}
if (id) printf("%d %d", id, minOfMax);
else printf("%d", 0);
return 0;
}