乌鲁木齐网络赛J题(最小费用最大流模板)

2023-12-15 15:48

本文主要是介绍乌鲁木齐网络赛J题(最小费用最大流模板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends

  243人阅读  评论(0)  收藏  举报
  分类:
Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people.


Now our journey of Dalian ends. To be carefully considered are the following questions.


Next month in Xian, an essential lesson which we must be present had been scheduled.


But before the lesson, we need to attend a wedding in Shanghai.


We are not willing to pass through a city twice.


All available expressways between cities are known.


What we require is the shortest path, from Dalian to Xian, passing through Shanghai.


Here we go.


Input Format


There are several test cases.


The first line of input contains an integer tt which is the total number of test cases.


For each test case, the first line contains an integer m~(m\le 10000)m (m≤10000) which is the number of known expressways.


Each of the following mm lines describes an expressway which contains two string indicating the names of two cities and an integer indicating the length of the expressway.


The expressway connects two given cities and it is bidirectional.


Output Format


For eact test case, output the shortest path from Dalian to Xian, passing through Shanghai, or output -1−1 if it does not exist.


样例输入


3
2
Dalian Shanghai 3
Shanghai Xian 4
5
Dalian Shanghai 7
Shanghai Nanjing 1
Dalian Nanjing 3
Nanjing Xian 5
Shanghai Xian 8
3
Dalian Nanjing 6
Shanghai Nanjing 7
Nanjing Xian 8
样例输出


7
12

-1


每个城市拆成出点和入点,源点连西安和大连,汇点连上海,相当于求从西安到上海和从大连到上海最小距离之和,每个城市入点和出点之间连一条容量为1的边,但是注意,上海的容量必须是2,再根据给出的边,分别连接出点入点,存入相应花费,那么问题就可以转化成最小费用最大流了,如果流量不为2输出-1,否则输出最小花费。


[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #include<algorithm>  
  3. #include<string.h>  
  4. #include<map>  
  5. #include<queue>  
  6. #include<string>  
  7. using namespace std;  
  8. #define ll long long  
  9. const ll maxm = 10005;  
  10. const ll INF = 1e18 + 7;  
  11. struct node  
  12. {  
  13.     ll u, v, flow, cost, next;  
  14. }edge[maxm * 10];  
  15. map<string, ll>p;  
  16. ll cnt, s, t, n, m, sum, FLOW;  
  17. ll head[maxm * 10], dis[maxm * 10], pre[maxm * 10];  
  18. char a[maxm], b[maxm];  
  19. void init()  
  20. {  
  21.     p.clear();  
  22.     cnt = 0, s = 0, t = n * 5 + 1, sum = 0, FLOW = 0;  
  23.     memset(head, -1, sizeof(head));  
  24. }  
  25. void add(ll u, ll v, ll flow, ll cost)  
  26. {  
  27.     edge[cnt].u = u, edge[cnt].v = v;  
  28.     edge[cnt].flow = flow, edge[cnt].cost = cost;  
  29.     edge[cnt].next = head[u], head[u] = cnt++;  
  30.     edge[cnt].u = v, edge[cnt].v = u;  
  31.     edge[cnt].flow = 0, edge[cnt].cost = -cost;  
  32.     edge[cnt].next = head[v], head[v] = cnt++;  
  33. }  
  34. ll bfs()  
  35. {  
  36.     queue<ll>q;  
  37.     for (ll i = 0;i <= t;i++) dis[i] = INF;  
  38.     memset(pre, -1, sizeof(pre));  
  39.     dis[s] = 0, q.push(s);  
  40.     ll rev = 0;  
  41.     while (!q.empty())  
  42.     {  
  43.         ll u = q.front();q.pop();  
  44.         for (ll i = head[u];i != -1;i = edge[i].next)  
  45.         {  
  46.             ll v = edge[i].v;  
  47.             if (dis[v] > dis[u] + edge[i].cost&&edge[i].flow)  
  48.             {  
  49.                 dis[v] = dis[u] + edge[i].cost;  
  50.                 pre[v] = i, q.push(v);  
  51.             }  
  52.         }  
  53.     }  
  54.     if (dis[t] == INF) return 0;  
  55.     return 1;  
  56. }  
  57. ll MCMF()  
  58. {  
  59.     ll ans = 0, minflow;  
  60.     while (bfs())  
  61.     {  
  62.         minflow = INF;  
  63.         for (ll i = pre[t];i != -1;i = pre[edge[i].u])  
  64.             minflow = min(minflow, edge[i].flow);  
  65.         for (ll i = pre[t];i != -1;i = pre[edge[i].u])  
  66.             edge[i].flow -= minflow, edge[i ^ 1].flow += minflow;  
  67.         ans += dis[t] * minflow;  
  68.         FLOW += minflow;  
  69.     }  
  70.     return ans;  
  71. }  
  72. int main()  
  73. {  
  74.     ll i, j, k, T, c;  
  75.     scanf("%lld", &T);  
  76.     while (T--)  
  77.     {  
  78.         scanf("%lld", &n);  
  79.         init();  
  80.         ll nn = n * 2;  
  81.         for (i = 1;i <= n;i++)  
  82.         {  
  83.             scanf("%s%s%lld", a, b, &c);  
  84.             if (p[a] == 0)  
  85.             {  
  86.                 p[a] = ++sum, k = 1;  
  87.                 if (strcmp(a, "Shanghai") == 0) k = 2;  
  88.                 add(p[a], p[a] + nn, k, 0);  
  89.             }  
  90.             if (p[b] == 0)  
  91.             {  
  92.                 p[b] = ++sum, k = 1;  
  93.                 if (strcmp(b, "Shanghai") == 0) k = 2;  
  94.                 add(p[b], p[b] + nn, k, 0);  
  95.             }  
  96.             ll u = p[a], v = p[b];  
  97.             add(u + nn, v, INF, c);  
  98.             add(v + nn, u, INF, c);  
  99.         }  
  100.         ll u = p["Dalian"];  
  101.         add(s, u, 1, 0);  
  102.         u = p["Xian"];  
  103.         add(s, u, 1, 0);  
  104.         u = p["Shanghai"];  
  105.         add(u + nn, t, 2, 0);  
  106.         ll ans = MCMF();  
  107.         if (FLOW == 2) printf("%lld\n", ans);  
  108.         else printf("-1\n");  
  109.     }  
  110.     return 0;  
  111. }  

这篇关于乌鲁木齐网络赛J题(最小费用最大流模板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/496991

相关文章

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子