题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828
题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小值。
思路:spfa的应用,更新的时候判断max(dist[u],w(u,v))<dist[v]即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 #define MAXN 555 8 #define inf 1<<30 9 #define FILL(a,b) memset(a,b,sizeof(a)) 10 11 struct Edge{ 12 int v,w; 13 Edge(int _v,int _w):v(_v),w(_w){} 14 }; 15 16 int n,m,dist[MAXN]; 17 bool mark[MAXN]; 18 vector<Edge>g[MAXN]; 19 20 void spfa(int vs) 21 { 22 FILL(mark,false); 23 fill(dist,dist+n,inf); 24 queue<int>que; 25 que.push(vs); 26 dist[vs]=0; 27 while(!que.empty()){ 28 int u=que.front(); 29 que.pop(); 30 mark[u]=false; 31 for(int i=0;i<g[u].size();i++){ 32 int v=g[u][i].v,w=g[u][i].w; 33 if(max(dist[u],w)<dist[v]){ 34 dist[v]=max(dist[u],w); 35 if(!mark[v]){ 36 mark[v]=true; 37 que.push(v); 38 } 39 } 40 } 41 } 42 } 43 44 int main() 45 { 46 int _case,u,v,w,vs,t=1; 47 scanf("%d",&_case); 48 while(_case--){ 49 scanf("%d%d",&n,&m); 50 for(int i=0;i<n;i++)g[i].clear(); 51 while(m--){ 52 scanf("%d%d%d",&u,&v,&w); 53 g[u].push_back(Edge(v,w)); 54 g[v].push_back(Edge(u,w)); 55 } 56 scanf("%d",&vs); 57 spfa(vs); 58 printf("Case %d: ",t++); 59 for(int i=0;i<n;i++){ 60 if(dist[i]==inf)puts("Impossible"); 61 else printf("%d ",dist[i]); 62 } 63 } 64 return 0; 65 }