POJ2263(图论)

      本题不难理解,画图后很容易看出。即求各城市每条给定起点和终点间通路的最小负载,并据此求出所有最小负载中的最大值。

解题思路:本题是迪杰斯特拉(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==0break;
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 }


 

posted @ 2011-08-28 20:26  笑巧  阅读(545)  评论(0编辑  收藏  举报