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

Problem Description
An
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!)
 
Input
In the first line there is an integer T, indicates the number of test cases. (T <= 20)
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)
 
Output
Output
“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.

 
Sample Input
3

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

 
Sample Output
Case 1: 19
Case 2: NO
Case 3: 6
 
题意:将一个无向图删边得到一些子图,并使每个子图中存在哈密顿回路,并使所有哈密顿回路上边的权值最小。如果有,输出这个最小的子图,如果没有,输出NO。
题解:每个点的话就是出度和入度都为1了,每个点必须且仅走一次,这样的话就是二分图完美匹配了。
#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算法最优匹配)的更多相关文章

  1. hdu 2448(KM算法+SPFA)

    Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. HDU 2255 KM算法 二分图最大权值匹配

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  4. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  5. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. HDU 1533 KM算法(权值最小的最佳匹配)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. HDU 3435 KM A new Graph Game

    和HDU 3488一样的,只不过要判断一下是否有解. #include <iostream> #include <cstdio> #include <cstring> ...

  8. hdu 1853 KM算法

    #include<stdio.h> #include<math.h> #include<string.h> #define N 200 #define inf 99 ...

  9. km算法(二分图最大权匹配)学习

    啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...

随机推荐

  1. LibreOJ #6221. 幂数 !(数论+dfs+剪枝)

    写新题然后艹翻标程的感觉真是舒爽啊... 这题就是个dfs...先预处理出sqrt(n)范围内的素数,然后dfs构造合法的数就行了. 直接暴搜会TLE,需要剪一剪枝,不需要跑到最后一层再计算答案,边构 ...

  2. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  3. js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字

    js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字 <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  4. HRBUST 1819

    石子合并问题--圆形版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(27 users) Total Accepted: 26( ...

  5. linux查找进程id端口占用和杀死进程

    linux 查找进程id端口占用和杀死进程 ps 命令用于查看当前正在运行的进程 辅助上grep 用于搜索匹配ps -ef | grep java ps ax : 显示当前系统进程的列表 ps aux ...

  6. 杭电多校第七场-J-Sequence

    题目描述 Let us define a sequence as belowYour job is simple, for each task, you should output Fn module ...

  7. 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug

    这个文章的名字起的实在是有点长,主要是怕说不清楚. 在IOS上,输入时,我看到过的比较少,就两种,如附件两张图.一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘 ...

  8. 解决不走onActivityResult方法

    最近在开发公司项目,在使用startActivityForResult关联俩个Activity中,发现A跳转到B,B设置setResult之后,A没有执行onActivityResult,查找一下,发 ...

  9. EditText中inputType详解

    <EditText Android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  10. spring boot web 入门

    ① 新建一个maven项目. ② pom中parent设为 spring-boot-starter-parent .建议使用最新的 RELEASE 版本.否则可能需要设置 <repositori ...