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 == 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  }


 

你可能感兴趣的:(poj)