• 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
  • 相关阅读:
    springmvc文件上传
    4-5 动画Animation开发指南-动画基础类
    4-4 图片控件开发详解-2
    4-3 图片控件开发详解-1
    4-2 学习构建Flutter实例项目
    3-28 本章小结
    3-27 【视频讲解】调用硬件、第三方服务以及平台交互、通知
    3-26 【文档讲解】调用硬件、第三方服务以及平台交互、通知
    3-25 【视频讲解】表单输入与富文本
    3-24 【文档讲解】表单输入与富文本
  • 原文地址:https://www.cnblogs.com/ar940507/p/3247524.html
Copyright © 2020-2023  润新知