題解:
首先先跑一遍最短路,用pre數組記錄最短路路徑,枚舉路徑上的所有點(不包括 1 和 n),標記這些點再來跑最短路記錄其中最大的最短路。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <stack>
#include <cmath>
#include <deque>
#include <queue>
#include <list>
#include <set>
#include <map>
#define mem(a, b) memset(a, b, sizeof(a))
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 35;
struct node{
int v, c, use;
node(){};
node(int v, int c, int use):v(v),c(c), use(use){};
};
struct node1{
int v, c;
node1(){};
node1(int v, int c):v(v),c(c){};
}pre[maxn];
vector<node> v[maxn];
int vis[maxn], lowcost[maxn], mark[maxn];
void Dijkstra(int s, int n, int op){
for(int i = 0; i <= n; i++){
lowcost[i] = inf;
vis[i] = 0;
if(op == 0){
pre[i] = node1(-1, inf);
}
}
lowcost[s] = 0;
for(int i = 0; i < n; i++){
int k = -1;
int minn = inf;
for(int j = 1; j <= n; j++){
if(!vis[j] && lowcost[j] < minn){
minn = lowcost[j];
k = j;
}
}
if(k == -1){
break;
}
vis[k] = 1;
for(int j = 0; j < v[k].size(); j++){
if(mark[v[k][j].v] && !vis[v[k][j].v] && lowcost[k] + v[k][j].c < lowcost[v[k][j].v]){
lowcost[v[k][j].v] = lowcost[k] + v[k][j].c;
if(op == 0){
pre[v[k][j].v] = node1(k, v[k][j].c);
}
}
}
}
}
int main(){
int n, m;
while(scanf("%d %d", &n, &m), n&&m){
for(int i = 1; i <= n; i++){
v[i].clear();
mark[i] = 1;
}
for(int i = 0; i < m; i++){
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
v[x].push_back(node(y, c, 0));
v[y].push_back(node(x, c, 0));
}
Dijkstra(1, n, 0);
int ans = lowcost[n];
int s = n;
while(pre[s].v != 1){
mark[pre[s].v] = 0;
Dijkstra(1, n, 1);
ans = max(ans, lowcost[n]);
mark[pre[s].v] = 1;
s = pre[s].v;
}
if(ans == inf){
printf("Inf\n");
}
else{
printf("%d\n", ans);
}
}
}