这道题就是一个最短路模板题,SPFA,Dijkstra都可以过。
思路:先求出n到1的最短路,记录路径,之后分别把路径上的每一条边删去再求最短路,对这些之后求出最短路取max就是答案了。
思路想明白了就好说,一开始我想的是依次删除所有的边,求最短路取max,这么做总是有几个点会T,之后改成Dijkstra,还是T,弱渣的我丝毫没有想到是思路错了TAT。
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, ans, d[1001], fa[1001], f[1001];
bool vis[1001];
vector <int> G[1001];
struct edge{
int u, v, w;
}E[500005];
struct node{
int d, num;
bool operator < (node i)const{
return d > i.d;
}
}t;
priority_queue <node> q;
void dijkstra(int no){
memset(d, 0x7f, sizeof d);
memset(vis, 0, sizeof vis);
while(q.size()) q.pop();
d[n] = 0;
t.num = n, t.d = 0;
q.push(t);
while(q.size()){
t = q.top(); q.pop();
int u = t.num;
if(vis[u]) continue;
vis[u] = 1;
for(int j = 0; j < G[u].size(); j++){
int e = G[u][j], v = E[e].v == u ? E[e].u : E[e].v, w = E[e].w;
if(vis[v] || e == no) continue;
if(d[v] > d[u]+w) {
d[v] = d[u] + w;
t.num = v, t.d = d[v];
q.push(t);
if(!no) fa[v] = u, f[v] = e;
}
}
}
ans = max(ans, d[1]);
}
int main()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d %d %d", &E[i].u, &E[i].v, &E[i].w);
G[E[i].u].push_back(i);
G[E[i].v].push_back(i);
}
dijkstra(0);
for(int no = 1; no; no = fa[no]) dijkstra(f[no]);
printf("%d", ans);
}