本题不难理解,画图后很容易看出。即求各城市每条给定起点和终点间通路的最小负载,并据此求出所有最小负载中的最大值。
解题思路:本题是迪杰斯特拉(Dijkstra)的变形,但不是单源点的最短路径,而是按路径中最大权值作为搜索方向。
注意:将城市名字转化为数组标号。
代码如下:
View Code 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 #define Max 205
6 #define max(a,b) ((a)>(b)?(a):(b))
7 #define min(a,b) ((b)>(a)?(a):(b))
8 int map[Max][Max],visit[Max],d[Max],n,r,cn;
9 char city[Max][35];
10 int match(char c[])//将城市名字转化为数组标号
11 {
12 int i;
13 for(i=1;i<=cn;i++)//查找有没有与c相同的
14 if(strcmp(city[i],c)==0)
15 return i;
16 strcpy(city[i],c);//没有,加入
17 cn++;//城市数量加1
18 return i;
19 }
20 void dijkstra(int k,int end)
21 {
22 int i,mx;
23 for(i=1;i<=n;i++)
24 d[i]=map[k][i];
25 visit[k]=1;
26 while(k!=end)
27 {
28 mx=0; //取最大的
29 for(i=1;i<=n;i++)
30 if(!visit[i]&&mx<d[i])
31 {
32 mx=d[i];
33 k=i;
34 }
35 visit[k]=1;
36 for(i=1;i<=n;i++)
37 if(!visit[i])
38 d[i]=max(d[i],min(d[k],map[k][i]));
39 }
40 }
41 int main()
42 {
43 int i,k=0,a,b,c;
44 char c1[35],c2[35],start[35],end[35];
45 while(cin>>n>>r)
46 {
47 k++;
48 if(n==0&&r==0) break;
49 memset(map,0,sizeof(map));
50 memset(visit,0,sizeof(visit));
51 cn=0;
52 for(i=0;i<r;i++)
53 {
54 cin>>c1>>c2>>c;
55 a=match(c1);//查找下标
56 b=match(c2);
57 map[a][b]=map[b][a]=c;
58 }
59 cin>>start>>end;
60 a=match(start);
61 b=match(end);
62 dijkstra(a,b);
63 cout<<"Scenario #"<<k<<endl;
64 cout<<d[b]<<" tons"<<endl<<endl;
65 }
66 return 0;
67 }
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 #define Max 205
6 #define max(a,b) ((a)>(b)?(a):(b))
7 #define min(a,b) ((b)>(a)?(a):(b))
8 int map[Max][Max],visit[Max],d[Max],n,r,cn;
9 char city[Max][35];
10 int match(char c[])//将城市名字转化为数组标号
11 {
12 int i;
13 for(i=1;i<=cn;i++)//查找有没有与c相同的
14 if(strcmp(city[i],c)==0)
15 return i;
16 strcpy(city[i],c);//没有,加入
17 cn++;//城市数量加1
18 return i;
19 }
20 void dijkstra(int k,int end)
21 {
22 int i,mx;
23 for(i=1;i<=n;i++)
24 d[i]=map[k][i];
25 visit[k]=1;
26 while(k!=end)
27 {
28 mx=0; //取最大的
29 for(i=1;i<=n;i++)
30 if(!visit[i]&&mx<d[i])
31 {
32 mx=d[i];
33 k=i;
34 }
35 visit[k]=1;
36 for(i=1;i<=n;i++)
37 if(!visit[i])
38 d[i]=max(d[i],min(d[k],map[k][i]));
39 }
40 }
41 int main()
42 {
43 int i,k=0,a,b,c;
44 char c1[35],c2[35],start[35],end[35];
45 while(cin>>n>>r)
46 {
47 k++;
48 if(n==0&&r==0) break;
49 memset(map,0,sizeof(map));
50 memset(visit,0,sizeof(visit));
51 cn=0;
52 for(i=0;i<r;i++)
53 {
54 cin>>c1>>c2>>c;
55 a=match(c1);//查找下标
56 b=match(c2);
57 map[a][b]=map[b][a]=c;
58 }
59 cin>>start>>end;
60 a=match(start);
61 b=match(end);
62 dijkstra(a,b);
63 cout<<"Scenario #"<<k<<endl;
64 cout<<d[b]<<" tons"<<endl<<endl;
65 }
66 return 0;
67 }
来源:https://www.cnblogs.com/yueshuqiao/archive/2011/08/28/2156365.html