题意:   有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 (好题)的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  3. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  4. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  5. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  6. SQL面试笔试经典题(Part 1)

    本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...

  7. 刷LeetCode的正确姿势——第1、125题

    最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...

  8. AWS的SysOps认证考试样题解析

    刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...

  9. AWS开发人员认证考试样题解析

    最近在准备AWS的开发人员考试认证.所以特意做了一下考试样题.每道题尽量给出了文档出处以及解析. Which of the following statements about SQS is true ...

随机推荐

  1. 3_SQL Server通过代码的方式添加数据

    --通过代码添加数据 --第一种方式--insert into 表名(列名1,列名2,...)values (值1,值2,...)insert into Department(DepName, Dep ...

  2. 设置SQL Server 2005数据库使之可以远程连接

    1. 开启sql2005远程连接功能,开启办法如下: 配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->打开MSSQLSERVER节点下的Databas ...

  3. 【Alpha】Daily Scrum Meeting——Day6

    站立式会议照片 1.本次会议为第五次Meeting会议: 2.本次会议在上午大课间09:40,在禹州楼召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 燃尽图 每个人的工作分配 成 ...

  4. 201521123117 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结: 1.通过equals方法以及l ...

  5. 201521123057 《Java程序设计》 第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  6. 201521123026《Java程序设计》第2周学习总结

    1. 本章学习收获 1.熟悉了码云的部分功能的使用 2.java编程基础的巩固以及延伸 3.解决了部分PTA编程时所遇到困难并明白了解决困难的方法的原理 4.了解了用package和import管理类 ...

  7. 201521123105 《Java程序设计》第1周学习总结

    1.学习总结      简单学习jave 了解并区分JVM JRE JDK 了解JAVA语言的发展史 2.书面作业        Q:为什么java程序可以跨平台运行?执行java程序的步骤是什么?( ...

  8. 201521123048 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? ...

  9. Python2.7笔记——常用技术点汇总

    目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...

  10. Java Build Path(Java 构建路径)

    Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包 项目相关的 jar 包及类文件 项目引用的的类库 我们可以通过使用 Java 项目属性对话框中的 Java Build P ...