分析:dist[]记录到目前为止的最大值,一直更新到终点。
给出dijkstra和spfa算法
/*求最短路的最大值*/
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
const int maxn=1005;
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std;
struct Edge
{
int e,w;
Edge(){}
Edge(int _e,int _w):e(_e),w(_w){}
bool operator <(const Edge &v)const{
return w>v.w;
}
};
vector<Edge> edges[maxn]; //邻接表
int dist[maxn]; //记录到目前为止的最大值
int vis[maxn];
int dij(int S,int E)
{
priority_queue<Edge> q;
memset(dist,INF,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[S]=0;
q.push(Edge(S,0)); //起点到自己的距离为0
while(!q.empty())
{
int s=q.top().e;q.pop();
if(vis[s]) continue;
vis[s]=1;
for(int i=0;i<edges[s].size();i++)
{
int e=edges[s][i].e;
int w=edges[s][i].w;
if(!vis[e]&&dist[e]>max(dist[s],w)) //有比到目前为止更大的值,则更新
{
dist[e]=max(dist[s],w);
q.push(Edge(e,w));
}
}
}
return dist[E];
}
int spfa(int S,int E)
{
memset(vis,0,sizeof(vis));
memset(dist,INF,sizeof(dist));
queue<int> q;
q.push(S);
dist[S]=0;
vis[S]=1;
while(!q.empty())
{
int s=q.front();q.pop();
vis[s]=0;
for(int i=0;i<edges[s].size();i++)
{
int e=edges[s][i].e;
int w=edges[s][i].w;
if(dist[e]>max(dist[s],w))
{
dist[e]=max(dist[s],w);
if(!vis[e])
{
vis[e]=1;
q.push(e);
}
}
}
}
return dist[E];
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int N,M,Q;
int t=1;
while(cin>>N>>M>>Q,N+M+Q)
{
for(int i=0;i<maxn;i++) edges[i].clear();
int s,e,w;
for(int i=0;i<M;i++)
{
cin>>s>>e>>w;
edges[s].push_back(Edge(e,w));
edges[e].push_back(Edge(s,w));
}
if(t!=1) puts("");
cout<<"Case #"<<t++<<endl;
for(int i=0;i<Q;i++)
{
cin>>s>>e;
int ans=dij(s,e);
// int ans=spfa(s,e);
if(ans==INF) puts("no path");
else cout<<ans<<endl;
}
}
return 0;
}