博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3488 Tour 拆点+二分图最佳匹配
阅读量:5761 次
发布时间:2019-06-18

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

In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way roads connecting them. You are lucky enough to have a chance to have a tour in the kingdom. The route should be designed as: The route should contain one or more loops. (A loop is a route like: A->B->……->P->A.)

Every city should be just in one route.
A loop should have at least two cities. In one route, each city should be visited just once. (The only exception is that the first and the last city should be the same and this city is visited twice.)
The total distance the N roads you have chosen should be minimized.

题意:循环访问一个国家的所有城市,城市之间有边,求最小的花费

把所有城市拆成入点和出点,然后进行二分图最佳匹配即可。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int INF=0x3f3f3f3f; 7 const int maxn=505; 8 int g[maxn][maxn],match[maxn],lx[maxn],ly[maxn],visx[maxn],visy[maxn],s[maxn],n,m; 9 bool hungary(int u){10 visx[u]=1;11 for(int i=1;i<=n;++i){12 if(!visy[i]&&lx[u]+ly[i]==g[u][i]){13 visy[i]=1;14 if(!match[i]||hungary(match[i])){15 match[i]=u;16 return 1;17 }18 }19 else if(!visy[i])s[i]=min(s[i],lx[u]+ly[i]-g[u][i]);20 }21 return 0;22 }23 int KM(){24 for(int i=1;i<=n;++i){25 for(int j=1;j<=n;++j)s[j]=INF;26 while(1){27 memset(visx,0,sizeof(visx));28 memset(visy,0,sizeof(visy));29 if(hungary(i))break;30 int d=INF;31 for(int j=1;j<=n;++j)32 if(!visy[j])d=min(d,s[j]);33 for(int j=1;j<=n;++j){34 if(visx[j])lx[j]-=d;35 if(visy[j])ly[j]+=d;36 else s[j]-=d;37 }38 }39 }40 int ans=0;41 for(int i=1;i<=n;++i)ans+=g[match[i]][i];42 return ans;43 }44 int main(){45 int T;46 scanf("%d",&T);47 while(T--){48 scanf("%d%d",&n,&m);49 memset(lx,0,sizeof(lx));50 memset(ly,0,sizeof(ly));51 memset(match,0,sizeof(match));52 memset(g,0xc0,sizeof(g));53 for(int i=1;i<=m;++i){54 int a,b,v;55 scanf("%d%d%d",&a,&b,&v);56 if(-v>g[a][b])g[a][b]=-v;57 }58 for(int i=1;i<=n;++i){59 for(int j=1;j<=n;++j){60 lx[i]=max(lx[i],g[i][j]);61 }62 }63 printf("%d\n",-KM());64 }65 return 0;66 }
View Code

 

转载于:https://www.cnblogs.com/cenariusxz/p/6592554.html

你可能感兴趣的文章
爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作
查看>>
用curl访问HTTPS站点并登录
查看>>
[置顶] android AIDL 进程间通信
查看>>
使用动态SQL语句实现简单的行列转置(动态产生列)
查看>>
Python字符编码详解(转)
查看>>
使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用
查看>>
TCP/IP数据包结构具体解释
查看>>
[WCF编程]7.实例上下文模式
查看>>
VMware coding Challenge
查看>>
使用EF取数据库返回的数据
查看>>
EditText获取焦点监听事件_EditText获取和失去焦点操作
查看>>
不同组织物料类别差异列表
查看>>
Tabio – 轻松,高效的管理 Chrome 标签页
查看>>
android4.0 的图库Gallery2代码分析(四) 之相册的数据处理以及显示
查看>>
事务——原子性、一致性、隔离性和持久性的理解
查看>>
MySQL内存调优
查看>>
測试文档和用户说明书
查看>>
POJ 2309 BST
查看>>
【extjs】 extjs5 Ext.grid.Panel 搜索示例
查看>>
Java并发编程:synchronized
查看>>