首先计算原始图中,起点到终点的最短路,然后依次删除最短路上的边,计算更新后的图中,起点到终点的最短路,选择所有最短路中长度最长的即可。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int mp[MAXN][MAXN];
int dis[MAXN], vis[MAXN], pre[MAXN];
int N, M;
int Dijsktra(int flag)
{
for (int i = 2; i <= N; i++)
{
vis[i] = 0;
dis[i] = INF;
}
dis[1] = 0, vis[1] = 1;
for (int i = 1; i <= N; i++)
{
int to = 1, minDis = INF;
for (int j = 2; j <= N; j++)
{
if (!vis[j] && dis[j] < minDis)
{
minDis = dis[j];
to = j;
}
}
vis[to] = 1;
for (int j = 2; j <= N; j++)
{
if (!vis[j] && dis[to] + mp[to][j] < dis[j])
{
dis[j] = dis[to] + mp[to][j];
if (flag)
pre[j] = to;
}
}
}
if (dis[N] == INF)
return -1;
else
return dis[N];
}
int main()
{
while (cin >> N >> M)
{
for (int i = 1; i <= N; i++) //初始化
{
pre[i] = i;
for (int j = 1; j <= N; j++)
{
if (i != j)
mp[i][j] = INF;
else
mp[i][j] = 0;
}
}
int u, v, w;
for (int i = 0; i < M; i++)
{
cin >> u >> v >> w;
mp[u][v] = mp[v][u] = w;
}
int maxLen = Dijsktra(1);
v = N;
while (v != 1) //依次删除最短路上的边,计算更新后的最短路
{
u = pre[v];
int temp = mp[u][v];
mp[u][v] = mp[v][u] = INF;
maxLen = max(maxLen, Dijsktra(0));
mp[u][v] = mp[v][u] = temp;
v = pre[v];
}
cout << maxLen << endl;
}
return 0;
}
继续加油。