hdu 3435(KM算法最优匹配)
A new Graph Game
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2360 Accepted Submission(s): 951
undirected graph is a graph in which the nodes are connected by
undirected arcs. An undirected arc is an edge that has no arrow. Both
ends of an undirected arc are equivalent--there is no head or tail.
Therefore, we represent an edge in an undirected graph as a set rather
than an ordered pair.
Now given an undirected graph, you could delete
any number of edges as you wish. Then you will get one or more
connected sub graph from the original one (Any of them should have more
than one vertex).
You goal is to make all the connected sub graphs
exist the Hamiltonian circuit after the delete operation. What’s more,
you want to know the minimum sum of all the weight of the edges on the
“Hamiltonian circuit” of all the connected sub graphs (Only one
“Hamiltonian circuit” will be calculated in one connected sub graph!
That is to say if there exist more than one “Hamiltonian circuit” in one
connected sub graph, you could only choose the one in which the sum of
weight of these edges is minimum).
For example, we may get two possible sums:
(1) 7 + 10 + 5 = 22
(2) 7 + 10 + 2 = 19
(There are two “Hamiltonian circuit” in this graph!)
In
each case, the first line contains two integers n and m, indicates the
number of vertices and the number of edges. (1 <= n <=1000, 0
<= m <= 10000)
Then m lines, each line contains three integers
a,b,c ,indicates that there is one edge between a and b, and the weight
of it is c . (1 <= a,b <= n, a is not equal to b in any way, 1
<= c <= 10000)
“Case %d: “first where d is the case number counted from one. Then
output “NO” if there is no way to get some connected sub graphs that any
of them exists the Hamiltonian circuit after the delete operation.
Otherwise, output the minimum sum of weight you may get if you delete
the edges in the optimal strategy.
3 4
1 2 5
2 1 2
2 3 10
3 1 7
3 2
1 2 3
1 2 4
2 2
1 2 3
1 2 4
Case 2: NO
Case 3: 6
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int INF = ;
const int N = ;
int graph[N][N];
int lx[N], ly[N];
bool visitx[N], visity[N];
int slack[N];
int match[N];
int n,m;
bool Hungary(int u)
{
int temp;
visitx[u] = true;
for(int i = ; i <= n; ++i)
{
if(visity[i])
continue;
else
{
temp = lx[u] + ly[i] - graph[u][i];
if(temp == ) //相等子图
{
visity[i] = true;
if(match[i] == - || Hungary(match[i]))
{
match[i] = u;
return true;
}
}
else //松弛操作
slack[i] = min(slack[i], temp);
}
}
return false;
}
void KM()
{
int temp;
memset(match,-,sizeof(match));
memset(ly,,sizeof(ly));
for(int i = ;i <= n;i++) //定标初始化
lx[i] = -INF;
for(int i =;i<=n;i++)
for(int j=;j<= n;j++)
lx[i] = max(lx[i], graph[i][j]);
for(int i = ; i <= n;i++)
{
for(int j = ; j <= n;j++)
slack[j] = INF;
while()
{
memset(visitx,false,sizeof(visitx));
memset(visity,false,sizeof(visity));
if(Hungary(i))
break;
else
{
temp = INF;
for(int j = ; j <= n; ++j)
if(!visity[j]) temp = min(temp, slack[j]);
for(int j = ; j <= n; ++j)
{
if(visitx[j]) lx[j] -= temp;
if(visity[j]) ly[j] += temp;
else slack[j] -= temp;
}
}
}
}
}
int main()
{
int tcase;
int t= ;
scanf("%d",&tcase);
while(tcase--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
graph[i][j] = -INF;
}
}
for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(u==v) continue;
graph[u][v] = graph[v][u] = max(graph[u][v],-w);
}
KM();
int ans = ;
bool flag = false;
for(int i=;i<=n;i++){
if(match[i]==-||graph[match[i]][i]==-INF){
flag = true;
break;
}
ans+=graph[match[i]][i];
}
printf("Case %d: ",t++);
if(flag)printf("NO\n");
else printf("%d\n",-ans);
}
return ;
}
hdu 3435(KM算法最优匹配)的更多相关文章
- hdu 2448(KM算法+SPFA)
Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- HDU 2255 KM算法 二分图最大权值匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 1533 KM算法(权值最小的最佳匹配)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 3435 KM A new Graph Game
和HDU 3488一样的,只不过要判断一下是否有解. #include <iostream> #include <cstdio> #include <cstring> ...
- hdu 1853 KM算法
#include<stdio.h> #include<math.h> #include<string.h> #define N 200 #define inf 99 ...
- km算法(二分图最大权匹配)学习
啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...
随机推荐
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- purfer序列题表
purfer序列是对于带编号(互不相同)的无根树进行编码得到的,对于同样的n个顶点,其有n-2项,有n^(n-2)种,而且每种都合法(如果只要求他是一棵树的话)(可以通过证明翻译过程维持了各部分的树的 ...
- HDU3068:最长回文(Manacher模板)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- SCU 4527 NightMare2 最短路+二分 好题
可怜的又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦.不过,这次 ...
- windows版本redis下载安装
官方网站:http://redis.io/ 官方下载:http://redis.io/download 可以根据需要下载不同版本 在官方下载网页中有一个window版本的说明,说redis官方没有wi ...
- Tomcat免安装版+Eclipse配置
Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程 重新记录下来,以便以后如果忘记了可以随时查看. 注意:首先要明确 ...
- J2EE保留小数问题
如果在前台页面,可以直接使用js的toFixed() 方法.number.toFixed(x) 可把 Number 四舍五入为指定小数位数的数字.参数x :必需.规定小数的位数,是 0 ~ 20 之 ...
- Java迭代实现斐波那契数列
剑指offer第九题Java实现 题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. public class Test9 { public static void ...
- 表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- 基于 Docker 的 Zabbix 微服务系统
zabbix 官网提供一个镜像 [ zabbix-appliance ], 可以直接拉起一个 zabbix-server. 但是数据库无法分离出来. 本实践使用 zabbix 官方提供的 Docker ...