POJ3228 并查集或二分最大流枚举答案
忘记写题意了。这题题意:给出每个地点的金矿与金库的数量,再给出边的长度。求取最大可通过边长的最小权值使每个金矿都能运输到金库里。
这题和之前做的两道二分枚举最大流答案的问法很相识,但是这里用最大流速度不够快,所以用了并查集来判断。
方法:边排序后,每次边判断为,将两点合集,若合集中满足金库数量大于金矿数量 则该合集满足条件。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 40000
int n,m,ans,in,out;
int fa[500],f[500];
bool flag;
struct Edge{
int a,b,len;
}edge[MAXN];
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
bool cmp(Edge a,Edge b)
{
return a.len<b.len;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
int num=0; //不满足的集合个数
memset(f,0,sizeof(f));
for(int i=0;i<n;i++)
{
scanf("%d",&in);
f[i+1]-=in;
}
for(int i=0;i<n;i++)
{
scanf("%d",&out);
f[i+1]+=out;
if(f[i+1]<0)num++;
}
scanf("%d",&m);
int a,b,c;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[i].a=a;
edge[i].b=b;
edge[i].len=c;
}
sort(edge,edge+m,cmp);
int f1,f2;
for(int i=0;i<=n;i++)
fa[i]=i;
flag=false;
for(int i=0;i<m;i++) //从小枚举边长 最多40000次
{
f1=find(edge[i].a);
f2=find(edge[i].b);
if(f1!=f2)
{
fa[f1]=f2; //合并时 进行判断 //f2成为父节点
//以f2为父节点的集合 加上以f1为父节点的结合的f 当此集合满足时
f[f2]+=f[f1];//更新集合若满足条件后 进行操作
if(f[f2]>=0)
{
if(f[f2]-f[f1]<0||f[f1]<0) //表示解决一个
num--;
}
else if(f[f2]<0)
{
if(f[f2]-f[f1]<0&&f[f1]<0) //两个问题合并成一个
num--;
}
if(num==0)
{
flag=true;
ans=edge[i].len;
}
}
if(flag)
break;
}
if(flag)
printf("%d\n",ans);
else
printf("No Solution\n");
}
return 0;
}
POJ3228 并查集或二分最大流枚举答案的更多相关文章
- HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流
二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...
- HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- [agc002D]Stamp Rally-[并查集+整体二分]
Description 题目大意:给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的边的最大编号最小.n, ...
- [AGC002D] Stamp Rally (并查集+整体二分)
Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...
- 【2018百度之星初赛 B】1001并查集 1004二分 1006不等式
1001 degree 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6380 并查集向图中加点,分别记录与初始度数最多的点 直接相连的点数.独立的点数 ...
- NOIP 2010 关押罪犯 并查集 二分+二分图染色
题目描述: S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值" ...
- BNU 51275 道路修建 Large 并查集
分析(引入Q神题解 %%%Q) 如果使用可持久化并查集,二分答案判定连通性,复杂度是O(mlog3n),不能在时限内出解.考虑到并查集实际上是一棵树,可以尝试在边上维护一些信息,假设t时刻加了一条边 ...
- BZOJ2303: [Apio2011]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
随机推荐
- HDU5727 Necklace(二分图匹配)
Problem Description SJX has 2*N magic gems. N of them have Yin energy inside while others have Yang ...
- Monotonicity 2[POI2010]
题目描述 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1 ...
- 庖丁解牛——CY7C68013A开发框架
大家好,好久不见了,距离上次发文章都有两个多星期了,非常高兴同时也非常感谢你们能一直关注我.之前在公众号上收到网友的消息,其大概意思就是问我能不能出点USB干货,为此我就把第二篇--解密USB2.0数 ...
- swift 录制多个音频 并将音频转换为mp3 并合成多个mp3文件为一个文件
我的需求是可以录制多个文件,最后生成的文件格式为mp3形式,查了下各种资料,因为swift无法直接将音频录制为mp3格式,所以最后我采取的解决方案为先将每个单独的文件转为mp3,最后逐一合并形成一个m ...
- css中的几个小tip(二)
margin的塌陷现象 (一)在标准文档流中, 垂直方向存在margin的塌陷现象 先上段代码: <style type="text/css"> .box{ width ...
- 封装sqlhelper类
using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using Syste ...
- 基于tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
基于tensorflow的‘端到端’的字符型验证码识别 1 Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展 ...
- Go的变量作用域
Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内部定义的变量称为局部变量 函数外部定义的变量称为全局变量 ...
- java修饰符public final static abstract transient
JAVA 修饰符public final static abstract transient 关键字: public final static abstract ... 1.public prot ...
- javascript如何创建一个换行节点
换行节点和其他节点的创建方式一样,使用document.createElement("br");创建节点, 并使用parentNode.appendChild()将节点插入到相应的 ...