zoukankan      html  css  js  c++  java
  • ZOJ2027

    题意:一个人要去旅行 给你起点和终点 求最少花费  其中花费为经过路径的总费用减去该路径的中的最大花费 ,Floyd 变型

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <map>
     7 using namespace std;
     8 #define inf 9999999
     9 #define N 205
    10 int n,m,sum[N][N],maxcost[N][N];
    11 map<string,int> mp; //map映射 
    12 
    13 void Floyd() //Floyd变型 
    14 {
    15     for(int k=0; k<n; k++)
    16     {
    17         for(int i=0; i<n; i++)
    18         {
    19             if(i==k||sum[i][k]==inf) continue;
    20             for(int j=0; j<n; j++)
    21             {
    22                 if(k==j||sum[k][j]==inf) continue;
    23                 int temp = sum[i][k] + sum[k][j] - max(maxcost[i][k],maxcost[k][j]);
    24                 if(temp < sum[i][j]-maxcost[i][j])//如果i经过中间点到j的总花费-最大花费小于直接到的 
    25                 {
    26                     sum[i][j] = sum[i][k]+sum[k][j];
    27                     maxcost[i][j] = max(maxcost[i][k],maxcost[k][j]);
    28                 }
    29             }
    30         }
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     string st,ed;
    37     while(cin>>st>>ed)
    38     {
    39         for(int i=0; i<N; i++)
    40         for(int j=0; j<N; j++)
    41         {
    42             if(i==j) 
    43             {
    44                 sum[i][j]=0;
    45                 maxcost[i][j]=0;
    46             }
    47             else 
    48             {
    49                 sum[i][j] = inf;
    50                 maxcost[i][j] = -1;
    51             }
    52         }
    53         mp.clear();
    54         n = 0;
    55         if(mp.find(st)==mp.end()) mp[st] = n++;
    56         if(mp.find(ed)==mp.end()) mp[ed] = n++;
    57         scanf("%d",&m);
    58         string s1,s2;
    59         int w;
    60         for(int i=0; i<m; i++)
    61         {
    62             cin>>s1>>s2>>w;
    63             if(mp.find(s1)==mp.end()) mp[s1] = n++;
    64             if(mp.find(s2)==mp.end()) mp[s2] = n++;
    65             sum[mp[s1]][mp[s2]] = w;
    66             maxcost[mp[s1]][mp[s2]] = w;
    67         }
    68         Floyd();
    69         int ans = sum[mp[st]][mp[ed]] - maxcost[mp[st]][mp[ed]];
    70         printf("%d
    ",ans);
    71     }
    72     return 0;
    73 }
    View Code
  • 相关阅读:
    Mina之session
    GNU C 、ANSI C、标准C、标准c++区别和联系
    SOCKET CLOSE_WAIT 搜集
    [转]二维数组和二级指针的传递问题
    Linux下C语言线程池的实现(1)
    MINA2 之日志配置
    mina里的死锁检测
    MINA2中的拆包组包的处理及一些方法
    void及void指针含义的深刻解析
    JS轻松实现单击文本框弹出选择日期
  • 原文地址:https://www.cnblogs.com/ar940507/p/3247524.html
Copyright © 2011-2022 走看看