UVa 10048 Audiophobia 最短路的最大值

来源:互联网 发布:淘宝装修 客户达 编辑:程序博客网 时间:2024/06/13 01:33

分析: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;}