思路:
- 正权无向图,求最长路,路的长度由途经径的最小长度定义
- dijkstra。
- 为什么这么慢?
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1005;
int mp[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int M,N;
int ans;
struct node{
int id;
int dis;
node(int x,int y) : id(x) , dis(y) {} ;
friend bool operator < (const node &a , const node &b)
{
return a.dis < b.dis;
}
};
priority_queue<node , vector<node> , less<node> > Q;
void INIT(){
while(Q.size())
Q.pop();
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
memset(dis,0,sizeof(dis));
return ;
}
void IJK(){
Q.push(node(1,INF));dis[1]=INF;
while(Q.size()){
node cur = Q.top() ; Q.pop();
if(vis[cur.id])
continue;
vis[cur.id] = true;
if(cur.id == M){
ans = cur.dis;
return ;
}
for(int i=1;i<=M;i++){
if(vis[i])
continue;
if(!mp[cur.id][i])
continue;
if(dis[i] < min(dis[cur.id] , mp[cur.id][i])){
dis[i] = min(dis[cur.id] , mp[cur.id][i]);
Q.push(node(i,dis[i]));
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
for(int t=1;t<=T;t++){
INIT();
cin>>M>>N;
for(int i=1;i<=N;i++){
int v,u,w;
cin>>v>>u>>w;
mp[v][u] = mp[u][v] = w;
}
IJK();
cout<<"Scenario #"<<t<<':'<<endl;
cout<<ans<<endl;
cout<<endl;
}
return 0;
}