【uva 1411 Ants蚂蚁们】

题目大意:

·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标)。现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交。

·特色:

我们如何保证线段间不相交。

·分析:

由“黑白”可以想到用二分图匹配(最大流问题亦可)。用到一个神秘结论,可以巧妙地将“相交”和“不相交”转化为具体数值大小关系,进而转化为权值。用一下这幅图进行分析:

         

下面来比较线段交叉和不交叉情况下,两条线段和的大小:

①交叉线段:(蓝色线段)

D1=dis(A,C)+dis(B,D)

    =(a2-a1)2+Y2+(b2-b1)2+X2

②非交叉线段(这里计算AB,CD,其余情况可以用对称性等价得到)

D2=dis(A,B)+dis(C,D)

     =a12+b12+(X-a2)2+(Y-b2)2

【做差】:

D1-D2=dis(A,C)+dis(B,D)-dis(A,B)-dis(C,D)

           =2*b2(Y-b1)+2*a2(X-a1)

【结论】:

由于Y==b1与X==a1同时满足是不可能的(点重合了!)

又因为Y>=b1,X>=a1所以上面D1-D2的式子必为正数。

这意味着D1恒大于D2。因此这需要我们进行最小权值的二分图完全匹配。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #define go(i,a,b) for(int i=a;i<=b;i++)
 6 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i>-1;i=e[i].next,v=e[i].v)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define inf 200000000
 9 #define eps 0.000001
10 using namespace std;const int N=1003;
11 struct POS{double x,y;}white[N],black[N];
12 struct E{int v,next;double w;}e[N*N];
13 int n,head[N],k,c[N],S[N],T[N];
14 void ADD(int u,int v,double w){e[k]=(E){v,head[u],w};head[u]=k++;}
15 double A(double x){return x*x;};double slack[N],Lx[N],Ly[N];
16 double dis(POS a,POS b){return sqrt(A(a.x-b.x)+A(a.y-b.y));}
17 bool aug(int u)
18 {
19     S[u]=1;fo(i,head,u)if(!T[v])
20     {double t=Lx[u]+Ly[v]-e[i].w;if(t<eps&&t>-eps)
21         {T[v]=1;if(!c[v]||aug(c[v])){c[v]=u;return 1;}}
22     else slack[v]=min(slack[v],t);}return 0;
23 }
24 void revise(){double a=inf;
25     go(i,1,n)if(!T[i])a=min(a,slack[i]);
26     go(i,1,n)S[i]?Lx[i]-=a,1:1,T[i]?Ly[i]+=a,1:1;
27 }
28 int main(){while(~scanf("%d",&n))
29 {
30     mem(head,-1);k=0;
31     go(i,1,n)scanf("%lf%lf",&white[i].x,&white[i].y);
32     go(i,1,n)scanf("%lf%lf",&black[i].x,&black[i].y);
33     go(i,1,n)go(j,1,n)ADD(i,j,-dis(white[i],black[j]));
34
35     go(u,1,n){Ly[u]=c[u]=0;Lx[u]=-inf;
36     fo(i,head,u)Lx[u]=max(Lx[u],e[i].w);}
37
38     go(i,1,n){go(j,1,n)slack[j]=inf;//slack 要每次清空
39     for(;;){go(j,1,n)S[j]=T[j]=0;
40     if(aug(i))break;else revise();}}
41
42     go(i,1,n)go(j,1,n)if(c[j]==i)
43     {printf("%d\n",j);break;}
44 }return 0;}//Paul_Guderian

【大米饼代码】

我看见了一条河。

时间: 2024-11-03 20:47:54

【uva 1411 Ants蚂蚁们】的相关文章

UVA 1411 - Ants(二分图完美匹配)

UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一次完美匹配就能够了 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAXNODE = 1

UVa 1411 Ants(分治)

https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. 1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 6 int n; 7 const int maxn = 205; 8 9 int vis[maxn]; 10 11 struct nod

Ants UVA - 1411(竟然让我换了个板子)

题意: 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段 解析: 带入负的欧几里得距离求就好了 假设a1-b1 与 a2-b2相交 则dis(a1, b1) + dis(a2, b2) 一定大于 dis(a1, b2) + dis(a2, b1) 四边形的对角线一定大于两条对边... 所以..边的权值取负的欧几里得距离..来一次km就好了   km是求最大  而负的最大 对应整的最小 而整的最小 又能对应不相交

UVA - 10714 Ants

最多时间就是每只蚂蚁选择最久的爬行方式 最少时间就是每只蚂蚁选择最快地爬行方式 #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include&

UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配)

题意:n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路:这个题目真是技巧啊,如果知道要求的就是整体最优,那么就容易做了.而不能用贪心来为每个蚂蚁选择最近的树,这样可能八成还是相交了. 整体最优能让每条线段不相交,证明: 假设a1-b1与a2-b2相交.则dis(a1,b1)+dis(a2,b2)>=dis(a1,b2)+dis(a2,b1).如果我们所决定的最优匹配是按照整体距离最短来匹配的,那么dis(a1,b1)+dis(

uva 10881 Piotr&#39;s Ants 解题报告

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1822 题目意思:有一条 L 厘米长的杆,上面有 n 只蚂蚁,给出每只蚂蚁的朝向以及离杆上最左端的距离,问 T 秒之后每只蚂蚁到达的位置,如果 T 秒后某个位置有多只蚂蚁同时到达,那么这堆蚂蚁处于的位置 + Turning,如果超过这条杆的长度,输出F

UVa 10881 Piotr&#39;s Ants (等价变换)

题意:一个长度为L的木棍上有n个蚂蚁,每只蚂蚁要么向左,要么向右,速度为1,当两只蚂蚁相撞时, 它们同时掉头.给定每只蚂蚁初始位置和朝向,问T秒后,每只蚂蚁的状态. 析:刚看到这个题时,一点思路也没有,怎么做啊,难道又要模拟么,一想,模拟...天呐,好麻烦! 最终还是看了一下题解.真是很巧妙哪. 首先是当两个蚂蚁相撞时,转向和不转向是看不出来的.也就是说掉头等价于对穿而过.也就是说, 如果把蚂蚁看成是没有区别的小点,那么只要独立算每只蚂蚁的位置即可.虽然是这么说,但是, 对每只蚂蚁却不是这样,但

【UVa 10881】Piotr&#39;s Ants

Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one, welcome our new insect overlords."Kent Brockman Piotr likes playing with ants. H

uva 10881 Piotr&#39;s Ants (模拟)

uva 10881 Piotr's Ants "One thing is for certain: there is no stopping them; the ants will soon be here. And I, for one, welcome our new insect overlords."Kent Brockman Piotr likes playing with ants. He has n of them on a horizontal pole L cm lo