题意:有一个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. Python+MySQL随机试卷及答案生成程序

    一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 下载地址:https://www.python.org/ ...

  2. sublime python 去掉单行超出字数的白色框框 (E501)

    方法一 E501错误:行过长 (大于79个字符),在配置文件里设置 忽略E501错误即可 首选项-->Package Settings-->Anaconda-->Settings - ...

  3. 通过实例学习 PyTorch

    通过范例学习 PyTorch 本博文通过几个独立的例子介绍了 PyTorch 的基础概念. 其核心,PyTorch 提供了两个主要的特征: 一个 n-维张量(n-dimensional Tensor) ...

  4. 【MySQL】汇总数据 - avg()、count()、max()、min()、sum()函数的使用

    第12章 汇总数据 文章目录 第12章 汇总数据 1.聚集函数 1.1.AVG()函数 avg() 1.2.COUNT()函数 count() 1.3. MAX()函数 max() 1.4.MIN() ...

  5. 这难道不是.NET5 的bug? 在线求锤?

    hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法. 也希望同学们能帮我理解. 一个朴素的需求 这是一个api项目,默认所有的api都需要授权, ...

  6. 1 分钟上手,在容器中运行 Visual Studio Code

    https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers 这个插件允许我们在容器中运 ...

  7. 【JAVA并发第三篇】线程间通信

    线程间的通信 JVM在运行时会将自己管理的内存区域,划分为不同的数据区,称为运行时数据区.每个线程都有自己私有的内存空间,如下图示: Java线程按照自己虚拟机栈中的方法代码一步一步的执行下去,在这一 ...

  8. 发票校验BAPI_INCOMINGINVOICE_CREATE

    CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'    EXPORTING      headerdata                = headerdata ...

  9. 【Android初级】利用startActivityForResult返回数据到前一个Activity(附源码+解析)

    在Android里面,从一个Activity跳转到另一个Activity.再返回,前一个Activity默认是能够保存数据和状态的.但这次我想通过利用startActivityForResult达到相 ...

  10. py, pyc, pyw, pyo, pyd Compiled Python File (.pyc) 和Java或.NET相比,Python的Virtual Machine距离真实机器的距离更远

    https://my.oschina.net/renwofei423/blog/17404 1.      PyCodeObject与Pyc文件 通常认为,Python是一种解释性的语言,但是这种说法 ...