博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LA 3353 最优巴士线路设计
阅读量:4916 次
发布时间:2019-06-11

本文共 2160 字,大约阅读时间需要 7 分钟。

给出一个 n 个点的有向图,找若干个圈,是的每个结点恰好属于一个圈。要求总长度尽量小。

 

三倍经验题 Uva 12264,HDU 1853 

这题有两种解法,一是匹配:

每个点只在一个圈中,则他有唯一的前驱和后继,也就是入度为1,出度为1,拆成 入度点和出度点,跑最小全匹配,因为是匹配,这样就保证了他在唯一的一个圈中,但是刘汝佳的板子有个问题,就是他会产生被迫的匹配,瞎起的名字,注意有这样的原本不存在的边,就说明无解。再次熟悉一下顶标。太久没写了~~~~

而是费用流:MCMF

就是中间cap = c,有无解就是看流量是否为 n ,是的,就是最小费用。

#include 
using namespace std;const int maxn = 100;const int inf = 1<<30;int W[maxn][maxn],n;int Lx[maxn],Ly[maxn]; ///顶标int lefts[maxn]; ///left[i] 为右边第 i 个点的标号bool S[maxn],T[maxn]; ///S,T左右第 i 个点是否标记bool match(int i) { S[i] = true; for(int j = 1; j <= n; j++) if(Lx[i]+Ly[j]==W[i][j]&&!T[j]) { T[j] = true; if(!lefts[j]||match(lefts[j])) { lefts[j] = i; return true; } } return false;}void update() { int a = 1<<30; for(int i = 1; i <= n; i++) if(S[i]) for(int j = 1; j <= n; j++) if(!T[j]) a = min(a,Lx[i]+Ly[j]-W[i][j]); for(int i = 1; i <= n; i++) { if(S[i]) Lx[i]-=a; if(T[i]) Ly[i]+=a; }}void KM() { for(int i = 1; i <= n; i++) { lefts[i] = Lx[i] = Ly[i] = 0; for(int j = 1; j <= n; j++) Lx[i] = max(Lx[i],W[i][j]); } for(int i=1;i<=n;i++) { for(;;) { for(int j=1;j<=n;j++) S[j] = T[j] = 0; if(match(i)) break; else update(); } }}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d",&n),n) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) W[i][j] = -inf; memchr(W,-inf,sizeof(W)); for(int u = 1; u <= n ; u++) { int v,c; while(scanf("%d",&v),v) { scanf("%d",&c); W[u][v] = max(W[u][v],-c); } } KM(); bool flag = true; int ans = 0; for(int j = 1; j <= n; j++) { int i = lefts[j]; if(W[i][j]==-inf) { flag = false; break; } ans+= -W[i][j]; } if(flag==false) puts("N"); else printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/TreeDream/p/8376599.html

你可能感兴趣的文章
Mysql打开日志信息
查看>>
[Xcode 实际操作]六、媒体与动画-(14)使用SystemSoundId播放简短声音
查看>>
[Swift通天遁地]三、手势与图表-(6)创建包含三条折线的线性图表
查看>>
[Swift]LeetCode13. 罗马数字转整数 | Roman to Integer
查看>>
OpenGL学习笔记2017/8/29
查看>>
实验吧web加了料的报错注入
查看>>
字符窜转对象
查看>>
6、Linux 基础(二)
查看>>
Letter Combinations of a Phone Number
查看>>
C#动态操作DataTable(新增行、列、查询行、列等)
查看>>
Slim 微型框架的使用
查看>>
高程5.4 RegExp类型
查看>>
CMD复制文件夹
查看>>
尽力而为
查看>>
Java技术预备作业
查看>>
阿虎烧烤的新感悟-O2O你真的会玩吗?
查看>>
Oracle10g闪回恢复区详细解析(转载)
查看>>
手把手教你从零认识webpack4.0
查看>>
(译)加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分
查看>>
[小米OJ] 3. 大数相减
查看>>