【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)
题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈。请输出满足以上条件的最小权和。
解法:有向圈?也就是每个点有唯一的后继。这是一个可逆命题,同样地,只要每个点都有唯一的后继,那么它们一定恰好属于一个圈。而“唯一”可以想到二分图匹配。把每个点拆成两个点,分别放在二分图的两边。两侧的点连的边就是原来的边的转化,另外再给源点和汇点分别连 n 条容量为1、费用为0的边。这样就保证了每个点有唯一的后继。再由于是要求所有点都属于一个圈,也就是完美匹配,就判断一下是否满流,流入汇点的总流量是否为 n 就行了。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<queue>
6 using namespace std;
7
8 const int N=110,M=30010,NN=310,D=110,INF=(int)1e9;
9 int n,len;
10 int last[NN],vis[NN],id[NN],pre[NN],flow[NN],d[NN];
11 struct edge{int y,fl,c,next;}e[M];
12 queue<int> q;
13
14 int mmin(int x,int y) {return x<y?x:y;}
15 void ins(int x,int y,int fl,int c)
16 {
17 e[++len].y=y,e[len].fl=fl,e[len].c=c;
18 e[len].next=last[x],last[x]=len;
19 e[++len].y=x,e[len].fl=0,e[len].c=-c;
20 e[len].next=last[y],last[y]=len;
21 }
22 bool spfa(int st,int ed)
23 {
24 while (!q.empty()) q.pop();
25 memset(vis,0,sizeof(vis));
26 memset(d,63,sizeof(d));
27 memset(pre,0,sizeof(pre));
28 q.push(st);
29 d[st]=0,vis[st]=1,flow[st]=INF;
30 while (!q.empty())
31 {
32 int x=q.front();
33 q.pop(); vis[x]=0;
34 for (int i=last[x];i;i=e[i].next)
35 {
36 int y=e[i].y;
37 if (e[i].fl && d[x]+e[i].c<d[y])
38 {
39 d[y]=d[x]+e[i].c;
40 flow[y]=mmin(flow[x],e[i].fl);
41 id[y]=i,pre[y]=x;
42 if (!vis[y]) q.push(y),vis[y]=1;
43 }
44 }
45 }
46 return pre[ed];
47 }
48 int Max_flow(int st,int ed)
49 {
50 int sum=0,h=0;
51 while (spfa(st,ed))
52 {
53 sum+=flow[ed]*d[ed];
54 h+=flow[ed];
55 for (int i=ed;i!=st;i=pre[i])
56 {
57 e[id[i]].fl-=flow[ed];
58 e[id[i]^1].fl+=flow[ed];
59 }
60 }
61 if (h==n) return sum;
62 return 0;
63 }
64 int main()
65 {
66 while (1)
67 {
68 scanf("%d",&n);
69 if (!n) break;
70 int st=2*n+1,ed=2*n+2,x,y;
71 len=1;
72 memset(last,0,sizeof(last));
73 for (int i=1;i<=n;i++)
74 {
75 ins(st,i,1,0),ins(n+i,ed,1,0);
76 while (1)
77 {
78 scanf("%d",&x);
79 if (!x) break;
80 scanf("%d",&y);
81 ins(i,n+x,1,y);
82 }
83 }
84 int ans=Max_flow(st,ed);
85 if (!ans) printf("N\n");
86 else printf("%d\n",ans);
87 }
88 return 0;
89 }
【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)的更多相关文章
- UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1349 Optimal Bus Route Design 最优公交路线(最小费用流,拆点)
题意: 给若干景点,每个景点有若干单向边到达其他景点,要求规划一下公交路线,使得每个景点有车可达,并且每个景点只能有1车经过1次,公车必须走环形回到出发点(出发点走2次).问是否存在这样的线路?若存在 ...
- UVa 1349 Optimal Bus Route Design (最佳完美匹配)
题意:给定一个有向图,让你找出若干个图,使得每个点恰好属于一个圈,并且总的权和最小. 析:每个点都有唯一的一个圈,也就是说每一点都有唯一的后继,那么我们就可以转换成求一个图的最小权的最佳完全匹配,可以 ...
- UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...
- UVA - 1349 D - Optimal Bus Route Design
4. D - Optimal Bus Route Design 题意:给出n(n<=100)个点的带权有向图,找出若干个有向圈,每个点恰好属于一个有向圈.要求权和尽量小. 注意即使(u,v)和( ...
- UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)
UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- UVA1349 Optimal Bus Route Design 拆点法+最小费用最佳匹配
/** 题目:UVA1349 Optimal Bus Route Design 链接:https://vjudge.net/problem/UVA-1349 题意:lrj入门经典P375 给n个点(n ...
- 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)
二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...
- UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi ...
随机推荐
- js 判断用户是手机端还是电脑端访问
通过userAgent 判断,网页可以直接使用 navigation对象 node端 可以通过请求头的 ctx.request.header['user-agent'] const browser = ...
- 【Flutter】容器类组件之剪裁
前言 Flutter中提供了一些剪裁函数,用于对组件进行剪裁. 剪裁Widget 作用 ClipOval 子组件为正方形时剪裁为内贴圆形,为矩形时,剪裁为内贴椭圆 ClipRRect 将子组件剪裁为圆 ...
- 【EXPDP】导出全部表的时候,选择不导出某个表
导出的时候指定某一张表不导出的话,一般都用的是数据泵的expdp来操作 具体方法是: expdp test/test dumpfile=test.dmp directory=test_dir excl ...
- 【Oracle】B-tree和函数索引
转自:https://www.cnblogs.com/yumiko/p/5957613.html 函数索引 1.1 概述 在实际应用中,当条件列使用函数运算进行数据匹配时,即使该列建立了索引,索引也不 ...
- 5V充8.4V,5V升压8.4V给电池充电的芯片电路
5V充8.4V的锂电池,需要把USB口的5V输入,升压转换成8.4V来给两串电池充电. 5V升压8.4V给锂电池充电的专门充电IC 集成了5V升压8.4V电路和充电管理电路的PL7501C 如果不需要 ...
- scrapy的大文件下载(基于一种形式的管道类实现)
scrapy的大文件下载(基于一种形式的管道类实现) 爬虫类中将解析到的图片地址存储到item,将item提交给指定的管道 在管道文件中导包:from scrapy.pipelines.images ...
- Redis 实战 —— 08. 实现自动补全、分布式锁和计数信号量
自动补全 P109 自动补全在日常业务中随处可见,应该算一种最常见最通用的功能.实际业务场景肯定要包括包含子串的情况,其实这在一定程度上转换成了搜索功能,即包含某个子串的串,且优先展示前缀匹配的串.如 ...
- Jmeter非GUI界面对阿里云服务器压测
一.Jmeter非GUI界面 参数讲解 讲解:非GUI界面,压测参数讲解 -h 帮助 -n 非GUI模式 -t 指定要运行的 JMe ...
- 基于Vue的npm组件库
前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...
- Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
Different ways to concatenate two strings in Golang - GeeksforGeeks https://www.geeksforgeeks.org/di ...