//图的遍历 //CITY记录到当前城市的的最大运载量 //状态转移方程,city[y] = max(city[y],min(r[x->y],city[x]); #include<iostream> #include<map> #include<string> #include<queue> using namespace std; const int MAX = 205; const int MAXM = 40000; const int INF = 1000000000; int W[MAXM],V[MAXM],next[MAXM],head[MAX]; bool inq[MAX]; int city[MAX]; int m = 0,N,M; void addEdge(int u,int v,int w) { V[m] = v; W[m] = w; next[m] = head[u]; head[u] = m++; } int Search(int st,int ed)//SPFA变形 { queue<int> q; memset(inq,0,sizeof(inq)); city[st] = INF; q.push(st); inq[st] = 1; while(!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for(int e = head[u];e != -1;e = next[e]) if(city[V[e]] < min(city[u],W[e])) { city[V[e]] = min(city[u],W[e]);//就这一点点简单变形 if(!inq[V[e]]) { q.push(V[e]); inq[V[e]] = 1; } } } return city[ed]; } int main() { //freopen("in.txt","r",stdin); int t = 0,n,w; while(scanf("%d%d",&N,&M) && N) { n = m = 0; map<string,int> Map; memset(head,-1,sizeof(head)); memset(city,0,sizeof(city)); for(int i = 0;i < M;++i) { char s1[35],s2[35]; scanf("%s%s%d",s1,s2,&w); if(Map.find(s1) == Map.end()) Map[s1] = ++n; if(Map.find(s2) == Map.end()) Map[s2] = ++n; int c1 = Map[s1],c2 = Map[s2]; addEdge(c1,c2,w); addEdge(c2,c1,w); } char s1[35],s2[35]; scanf("%s%s",s1,s2); printf("Scenario #%d/n",++t); printf("%d tons/n/n",Search(Map[s1],Map[s2])); } return 0; }