题目地址:
题解:题目意思为从起点到终点的最短路中有一条路不能通过了,求到从起点到终点的最短距离。
可以先找出从起点到终点的最短距离,并将路径保存下来,然后枚举最短路径中的所有路径,求
出从起点到终点的最短路径中最长的一条。
#include<iostream>
#include<string>
#include<queue>
using namespace std;
const int maxn = 1005;
const int INF = 200000000;
struct node
{
int v,t;
struct node *next;
}*head[maxn],edge[maxn*maxn];
int n,m,dis[maxn],per[maxn];
bool vis[maxn];
queue<int> que;
void spfa()
{
for(int j = 1; j <= n; j++)
dis[j] = INF,vis[j] = false;;
dis[1] = 0;vis[1] = true;
que.push(1);
while(!que.empty())
{
int now = que.front();
que.pop();
vis[now] = false;
for(node *p = head[now] ; p ; p = p->next)
{
if(dis[p->v] > dis[now] + p->t)
{
dis[p->v] = dis[now] + p->t;
per[p->v] = now;//记录到点p->的前驱结点
if(!vis[p->v])
{
vis[p->v] = true;
que.push(p->v);
}
}
}
}
}
void spfa(int x,int y)
{
for(int i = 1; i <= n; i++)
dis[i] = INF,vis[i] = false;
vis[1] = true;
dis[1] = 0;
que.push(1);
while(!que.empty())
{
int now = que.front();
que.pop();
vis[now] = false;
for(node *p = head[now] ; p ; p = p->next)
{
if((now == y && p->v == x)||(now == x && p->v == y))//路p->v到now的路不能走
continue;
if( dis[p->v] > dis[now] + p->t)
{
dis[p->v] = dis[now] + p->t;
if(!vis[p->v])
{
vis[p->v] = true;
que.push(p->v);
}
}
}
}
}
int main()
{
int i;
int a,b,time;
while(cin >> n >> m)
{
for(i = 1; i <= n; i++)
head[i] = NULL;
node *p = edge;
while(m --)
{
cin >> a >> b >> time;
p->v = b;p->t = time;
p->next = head[a];
head[a] = p++;
p->v = a; p->t = time;
p->next = head[b];
head[b] = p++;
}
per[1] = -1;
spfa();
int max = dis[n];
for(i = n; per[i] != -1; i = per[i])//枚举最短路中的所有路径。
{
spfa(i,per[i]);
if(dis[n] != INF && dis[n] > max)
max = dis[n];
}
printf("%d\n",max);
}
return 0;
}