HDU3844Tour (好题)
题意: 有N个点,M个单向边,现在要你设计N条路线覆盖所有的点,每个点都属于且值属于一个环。(为什么是N条边:和最小生成树为什么有N-1条边是一样的证明)。
解析: 每个点都有一个喜欢对象(出度)和被喜欢对象(入度),故将一个点拆成男点和女点,然后用最佳匹配即可!
坑die:有重边!MMP
相似的题目:1853 3435
(好像还可以用网络流来解决,容我想两天)
HDU3844
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
const int inf=0x7ffffff;
int map[maxn][maxn];
int vis1[maxn],vis2[maxn];
int ex1[maxn],ex2[maxn];
int lack[maxn];
int link[maxn];
int ans,n;
int x1[maxn],x2[maxn],y[maxn],y2[maxn];
int Abs(int v){
if(v<) v=-v;
return v;
}
bool _bfs(int v)
{
vis1[v]=true;
for(int i=;i<=n;i++){
if(!vis2[i]){
int tmp=ex1[v]+ex2[i]-map[v][i];
if(tmp==){
vis2[i]=true;
if(!link[i]||_bfs(link[i])){
link[i]=v;
return true;
}
}
else if(tmp<lack[i]) lack[i]=tmp;
}
}
return false;
}
void _KM()
{
int t,i,j;
memset(link,,sizeof(link));
memset(ex2,,sizeof(ex2));
for(i=;i<=n;i++){
ex1[i]=map[i][];
for(j=;j<=n;j++)
if(ex1[i]<map[i][j]) ex1[i]=map[i][j];
}
for(t=;t<=n;t++){
for(i=;i<=n;i++) lack[i]=inf;
while(true){
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if(_bfs(t)) break;
int gap=inf;
for(i=;i<=n;i++)
if(!vis2[i]&&lack[i]<gap) gap=lack[i];
for(i=;i<=n;i++) if(vis1[i]) ex1[i]-=gap;
for(i=;i<=n;i++) if(vis2[i]) ex2[i]+=gap;
for(i=;i<=n;i++) if(!vis2[i])lack[i]-=gap;
}
}
ans=;
for(i=;i<=n;i++)
ans-=map[link[i]][i];
ans=ans;
printf("%d\n",ans);
}
int main()
{
int i,j,m,T,u,v,w;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
for(j=;j<=n;j++) map[i][j]=inf;
for(i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if(w<map[u][v]) map[u][v]=w;//消灭重边
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)map[i][j]=-map[i][j];
_KM();
}
return ;
}
HDU1853 :普通匈牙利算法算是否false得到-1 。
或者直接KM,若有map[link[i]][i]=-inf,即匹配到不存在的边,也得到-1.
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
const int inf=0x7ffffff;
int map[maxn][maxn];
int vis1[maxn],vis2[maxn];
int ex1[maxn],ex2[maxn];
int lack[maxn];
int link[maxn];
int ans,n;
bool _bfs2(int v)
{
vis1[v]=true;
for(int i=;i<=n;i++){
if(!vis2[i]&&-map[v][i]!=inf){
vis2[i]=true;
if(!link[i]||_bfs2(link[i])){
link[i]=v;
return true;
}
}
}
return false;
} bool _bfs(int v)
{
vis1[v]=true;
for(int i=;i<=n;i++){
if(!vis2[i]){
int tmp=ex1[v]+ex2[i]-map[v][i];
if(tmp==){
vis2[i]=true;
if(!link[i]||_bfs(link[i])){
link[i]=v;
return true;
}
}
else if(tmp<lack[i]) lack[i]=tmp;
}
}
return false;
} void _KM()
{
int t,i,j;
memset(link,,sizeof(link));
for(i=;i<=n;i++){
memset(vis2,,sizeof(vis2));
if(!_bfs2(i)){
printf("-1\n");
return ;
}
}
memset(link,,sizeof(link));
memset(ex2,,sizeof(ex2));
for(i=;i<=n;i++){
ex1[i]=map[i][];
for(j=;j<=n;j++)
if(ex1[i]<map[i][j]) ex1[i]=map[i][j];
}
for(t=;t<=n;t++){
for(i=;i<=n;i++) lack[i]=inf;
while(true){
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if(_bfs(t)) break;
int gap=inf;
for(i=;i<=n;i++)
if(!vis2[i]&&lack[i]<gap) gap=lack[i];
for(i=;i<=n;i++) if(vis1[i]) ex1[i]-=gap;
for(i=;i<=n;i++) if(vis2[i]) ex2[i]+=gap;
for(i=;i<=n;i++) if(!vis2[i])lack[i]-=gap;
}
}
ans=;
for(i=;i<=n;i++){
ans-=map[link[i]][i];
}
printf("%d\n",ans);
}
int main()
{
int i,j,m,T,u,v,w;
while(~scanf("%d%d",&n,&m))
{
for(i=;i<=n;i++)
for(j=;j<=n;j++) map[i][j]=inf;
for(i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if(w<map[u][v]) map[u][v]=w;//消灭重边
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)map[i][j]=-map[i][j];
_KM();
}
return ;
}
HDU3844Tour (好题)的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- SQL面试笔试经典题(Part 1)
本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...
- 刷LeetCode的正确姿势——第1、125题
最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...
- AWS的SysOps认证考试样题解析
刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...
- AWS开发人员认证考试样题解析
最近在准备AWS的开发人员考试认证.所以特意做了一下考试样题.每道题尽量给出了文档出处以及解析. Which of the following statements about SQS is true ...
随机推荐
- java Properties类得到当前的系统属性
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt218 package com.shi.simpleUtil; import ...
- JS的this总结(上)-call()和apply()
JS的this总结(上)-call()和apply() 相信很多人在学习JavaScript的过程中,都会了解到this,而大部分人都会特意去网络上搜一下相关资料,大部分的文章都有这么一句话: t ...
- 图像处理:卷积模块FPGA 硬件加速
本文记录了利用FPGA加速图像处理中的卷积计算的设计与实现.实现环境为Altera公司的Cyclone IV型芯片,NIOS II软核+FPGA架构. 由于这是第一次设计硬件加速模块,设计中的瑕疵以及 ...
- NHibernte教程(10)--关联查询
本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...
- javascript this对象
函数运行时,自动生成的一个内部对象,只能在函数内部使用 随着函数使用场合的不同,this的值也发生着改变,但是有一个总原则:this指的是调用函数的那个对象(核心) this对象的指向 一般情况下,我 ...
- UTF-8编码规则【转】
hz_chenwenbiao UTF-8编码规则(转) UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode ...
- Web in Linux小笔记001
Linux灾难恢复: Root密码修复 Centos single Filesystem是硬盘文件根目录,无法再cd ..就像macitosh 硬盘图标 Pwd:显示绝对路径 MBR修复 模拟MBR被 ...
- 团队作业8——第二次项目冲刺(Beta阶段)日志集合处
Beta版本冲刺 http://www.cnblogs.com/vviane1/p/6886049.html 第一天(2017.05.22) http://www.cnblogs.com/vviane ...
- 201521123077 《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型类 利用泛型可以写出一个更加通用的类,比如下面的例子: class simpleHolder<T&g ...
- 201521123006 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 本周除了继承,我们还重点学习了多态. (1)多态性在于有相同的形态,却是不同的行为或者说是不 ...