题意:有n个城市,m条连接两个城市的道路(双向边),每条道路有自己的最大复载量。现在问从城市a到城市b,车上的最大载重能为多少。即求从a到b的路径中权值最小边的最大值
分析:贪心的思想,我们每次找 道路载重量最大的路加入集合中,其思想于最短路思想基本上是一样的,所以用最短路的思想解题,dist值改为路径上最大上限(相当于最大流,这里用最短路来解)
View Code
#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <map> using namespace std; #define inf (1<<29) const int maxn = 110 , maxm = 10010; int n , m; int cnt; map<string,int> mp; struct Edge{ int v,w,next; }edge[maxm]; int E, head[maxn]; inline void init() { E=0;memset(head,-1,sizeof(head)); } inline void addedge(int u,int v,int w) { edge[E].v=v;edge[E].w=w;edge[E].next=head[u];head[u]=E++; edge[E].v=u;edge[E].w=w;edge[E].next=head[v];head[v]=E++; } int dist[maxn]; bool vis[maxn]; int dijkstra(int a, int b) { for(int i=0;i<cnt;i++) dist[i] = 0 , vis[i] = 0; dist[a] = inf; while(1) { int u = -1 , Min = 0; for(int i=0;i<cnt;i++) if(!vis[i] && ( u==-1 || dist[i] > Min )) Min = dist[u=i]; if(u == b) return dist[u]; if(u==-1) break; vis[u] = 1; dist[u] = Min; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].v; if(!vis[v] && dist[v] < min(dist[u] , edge[i].w)) dist[v] = min(dist[u] , edge[i].w); } } return -1; } int main() { int cas = 1; string leno , hoo; while(~scanf("%d%d",&n,&m) && n) { cnt = 0; int u , v , w; mp.clear(); init(); for(int i=0;i<m;i++) { cin>>leno>>hoo>>w; if(mp[leno]==0) mp[leno] = cnt++; if(mp[hoo] ==0) mp[hoo] = cnt++; u = mp[leno]; v = mp[hoo]; addedge(u,v,w); } cin>>leno>>hoo; u = mp[leno]; v = mp[hoo]; int ans = dijkstra(u,v); printf("Scenario #%d\n%d tons\n\n",cas++,ans); } return 0; }