HDU5518 : John's Fences
求出平面图的对偶图,那么需要选择一些环,使得这些环可以异或出所有环。
对于两个不同的区域,需要用一个代价最小的环把它们区分开,这对应最小割。
那么求出对偶图的最小割树,所有树边之和就是把所有区域都区分开的最小代价。
#include<cstdio>
#include<cmath>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int>PI;
typedef long long ll;
const int N=1010,M=2010,inf=~0U>>2;
int Case,cas,n,m,cnt,i,x,y,z;map<PI,int>T;
struct P{
int x,y;
P(){}
P(int _x,int _y){x=_x,y=_y;}
ll operator*(const P&b){return 1LL*x*b.y-1LL*y*b.x;}
}a[N];
struct E{
int x,y,z;double o;
E(){}
E(int _x,int _y,int _z){x=_x,y=_y,z=_z,o=atan2(a[y].x-a[x].x,a[y].y-a[x].y);}
}e[M];
bool del[M];int from[M];
namespace GetArea{
struct cmp{bool operator()(int a,int b){return e[a].o<e[b].o;}};
set<int,cmp>g[N];set<int,cmp>::iterator k;int i,j,q[M],t;
void work(){
for(i=0;i<m+m;i++)if(!del[i]){
for(q[t=1]=j=i;;q[++t]=j=*k){
k=g[e[j].y].find(j^1);k++;
if(k==g[e[j].y].end())k=g[e[j].y].begin();
if(*k==i)break;
}
ll s=0;
for(j=1;j<=t;j++)s+=a[e[q[j]].x]*a[e[q[j]].y],del[q[j]]=1;
if(s<=0)continue;
for(cnt++,j=1;j<=t;j++)from[q[j]]=cnt;
}
}
}
namespace GH{
struct E{int t,f;E*nxt,*pair;}*g[N],*d[N],pool[10000],*cur;
int n,m,i,e[M][3],S,T,h[N],gap[N],maxflow,vis[N],a[N],b[N],ans;
void init(int _n){n=_n;m=ans=0;}
inline void newedge(int x,int y,int z){e[++m][0]=x;e[m][1]=y;e[m][2]=z;}
inline void add(int s,int t,int f){
E*p=cur++;p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
p=cur++;p->t=s;p->f=0;p->nxt=g[t];g[t]=p;
g[s]->pair=g[t];g[t]->pair=g[s];
}
inline int min(int a,int b){return a<b?a:b;}
int sap(int v,int flow){
if(v==T)return flow;
int rec=0;
for(E*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
int ret=sap(p->t,min(flow-rec,p->f));
p->f-=ret;p->pair->f+=ret;d[v]=p;
if((rec+=ret)==flow)return flow;
}
if(!(--gap[h[v]]))h[S]=T;
gap[++h[v]]++;d[v]=g[v];
return rec;
}
void dfs(int x){
vis[x]=1;
for(E*p=g[x];p;p=p->nxt)if(p->f&&!vis[p->t])dfs(p->t);
}
void solve(int l,int r){
if(l>=r)return;
int i;
for(cur=pool,i=1;i<=T;i++)g[i]=d[i]=NULL,h[i]=gap[i]=0;
for(i=1;i<=m;i++)add(e[i][0],e[i][1],e[i][2]),add(e[i][1],e[i][0],e[i][2]);
add(S,a[l],inf),add(a[r],T,inf);
for(gap[maxflow=0]=T,i=1;i<=T;i++)d[i]=g[i],vis[i]=0;
while(h[S]<T)maxflow+=sap(S,inf);
ans+=maxflow;
dfs(S);
int L=l,R=r;
for(i=l;i<=r;i++)if(vis[a[i]])b[L++]=a[i];else b[R--]=a[i];
for(i=l;i<=r;i++)a[i]=b[i];
solve(l,R),solve(L,r);
}
int work(){
S=n+1;T=S+1;
for(i=1;i<=n;i++)a[i]=i;
solve(1,n);
return ans;
}
}
inline int getid(){
int x,y;
scanf("%d%d",&x,&y);
if(T[PI(x,y)])return T[PI(x,y)];
T[PI(x,y)]=++n;
a[n]=P(x,y);
return n;
}
int main(){
scanf("%d",&Case);
for(cas=1;cas<=Case;cas++){
n=cnt=0;
T.clear();
scanf("%d",&m);
for(i=0;i<m;i++){
x=getid();
y=getid();
scanf("%d",&z);
e[i<<1]=E(x,y,z);
e[i<<1|1]=E(y,x,z);
}
for(i=0;i<m+m;i++)del[i]=from[i]=0;
for(i=1;i<=n;i++)GetArea::g[i].clear();
for(i=0;i<m+m;i++)GetArea::g[e[i].x].insert(i);
GetArea::work();
GH::init(cnt+1);
for(i=0;i<m+m;i+=2)GH::newedge(from[i]+1,from[i^1]+1,e[i].z);
printf("Case #%d: %d\n",cas,GH::work());
}
return 0;
}
HDU5518 : John's Fences的更多相关文章
- 2015ACM/ICPC亚洲区沈阳站 Solution
A - Pattern String 留坑. B - Bazinga 题意:找一个最大的i,使得前i - 1个字符串中至少不是它的子串 思路:暴力找,如果有一个串已经符合条件,就不用往上更新 #inc ...
- 洛谷P2735 电网 Electric Fences
P2735 电网 Electric Fences 11通过 28提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 在本题中,格点是 ...
- 洛谷P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...
- USACO6.4-Electric Fences:计算几何
Electric Fences Kolstad & Schrijvers Farmer John has decided to construct electric fences. He ha ...
- USACO 3.3 Riding the Fences
Riding the Fences Farmer John owns a large number of fences that must be repaired annually. He trave ...
- POJ 2018 Best Cow Fences(二分+最大连续子段和)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14601 Accepted: 4720 Desc ...
- POJ-2018 Best Cow Fences(二分加DP)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10174 Accepted: 3294 Desc ...
- 洛谷 P2731 骑马修栅栏 Riding the Fences 解题报告
P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...
- USACO 6.4 Electric Fences
Electric FencesKolstad & Schrijvers Farmer John has decided to construct electric fences. He has ...
随机推荐
- Vue.js货币格式化函数
函数: const digitsRE = /(\d{3})(?=\d)/g export function currency (value, currency, decimals) { value = ...
- 在Git.oschina.net中配置TortoiseGit使用sshkey,无需输入账号和密码
ssh的方式 git@oschina.com:用户名/版本库t.git 此篇文章针对于这种 黄海正在开发的项目位置 https://gitee.com/dslx/BigData.g ...
- [转] iOS9系统自带字体
Family: Thonburi Font: Thonburi-Bold Font: Thonburi Font: Thonburi-Light 1 2 3 4 Family: Khmer Sanga ...
- Asp.net 与 UCenter 用户同步之实施过程
在写这篇文章的时候,我还在想,这篇文章也许能给你带来一些收获,但或许会令你更加的迷茫,为什么会这样?因为:1.UCenter虽然足够强大,但正为它的强大,它的不少暗箱操作使得我们望而生畏,我们不害怕出 ...
- Docker镜像、容器剖析
我们通常所说的docker是什么? 在这里英文本意为“搬运工”这里指的的docker搬运点的是集装箱,集装箱装的是够任意类型的APP,开发者通过Docker可以将app变成一种标准化,可移植的.自管理 ...
- python 类、函数的引用
类的引用 一.同级目录引用: from 文件名 import 类名 如果报错,原因基本上就是:pycharm不会将当前文件目录自动加入自己的sourse_path. 解决方法: ...
- spark学习之路1--用IDEA编写第一个基于java的程序打包,放standalone集群,client和cluster模式上运行
1,首先确保hadoop和spark已经运行.(如果是基于yarn,hdfs的需要启动hadoop,否则hadoop不需要启动). 2.打开idea,创建maven工程.编辑pom.xml文件.增加d ...
- UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...
- AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...
- netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~
还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01 . netty02 .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...