题意:有一个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(图论--网络流 二分图的最小权完美匹配)的更多相关文章

  1. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. UVA 1349 Optimal Bus Route Design 最优公交路线(最小费用流,拆点)

    题意: 给若干景点,每个景点有若干单向边到达其他景点,要求规划一下公交路线,使得每个景点有车可达,并且每个景点只能有1车经过1次,公车必须走环形回到出发点(出发点走2次).问是否存在这样的线路?若存在 ...

  3. UVa 1349 Optimal Bus Route Design (最佳完美匹配)

    题意:给定一个有向图,让你找出若干个图,使得每个点恰好属于一个圈,并且总的权和最小. 析:每个点都有唯一的一个圈,也就是说每一点都有唯一的后继,那么我们就可以转换成求一个图的最小权的最佳完全匹配,可以 ...

  4. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

  5. UVA - 1349 D - Optimal Bus Route Design

    4. D - Optimal Bus Route Design 题意:给出n(n<=100)个点的带权有向图,找出若干个有向圈,每个点恰好属于一个有向圈.要求权和尽量小. 注意即使(u,v)和( ...

  6. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  7. UVA1349 Optimal Bus Route Design 拆点法+最小费用最佳匹配

    /** 题目:UVA1349 Optimal Bus Route Design 链接:https://vjudge.net/problem/UVA-1349 题意:lrj入门经典P375 给n个点(n ...

  8. 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)

    二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...

  9. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

随机推荐

  1. Linux下Hadoop2.7.3集群环境的搭建

    Linux下Hadoop2.7.3集群环境的搭建 本文旨在提供最基本的,可以用于在生产环境进行Hadoop.HDFS分布式环境的搭建,对自己是个总结和整理,也能方便新人学习使用. 基础环境 JDK的安 ...

  2. LeetCode 371两数之和

    题目描述: 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 思路: 既然不能使用运算符操作就要考虑到,位运算的加法. 加法有进位的时候和不进位的时候 ...

  3. 【Linux】linux的所有文件分类解析

    今天看书的时候,无意间看到/dev/文件夹,以前没注意,今天去看了下发现,很多文件的开头文件属性都是一些不怎么见到的 常见的是   -     这个是代表文件,可以vim编辑的 d     这个是代表 ...

  4. P1341 无序字母对(欧拉回路)

    题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一 ...

  5. ctfhub技能树—文件上传—MIME绕过

    什么是MIME MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访 ...

  6. kubectl命令管理

    kubectl命令管理 查看更多帮助命令 [root@k8s-master ~]# kubectl --help 创建一个命名空间 [root@k8s-master ~]# kubectl creat ...

  7. KeepAlive安装以及简单配置

    操作系统:Centos7.3 一.依赖安装 首先安装相关依赖: yum install -y gcc openssl-devel popt-devel yum -y install libnl lib ...

  8. 打包遇到错误Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test

    引自:https://blog.csdn.net/xiexiangyan/article/details/107936774 遇到的问题 有一个maven项目,我clone一下最新的代码.准备打包(m ...

  9. JVM重新认识(一)oop-klass模型--HSDB使用验证

    一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的. ...

  10. 转 9 jmeter之检查点

    9 jmeter之检查点   jmeter有类似loadrunner检查点的功能,就是断言中的响应断言. 1.响应断言(对返回文字结果进行相应的匹配)右击请求-->添加-->断言--> ...