poj 3565 Ants KM

题意:

给n只蚂蚁和n课苹果树的坐标,要让每只蚂蚁去一棵苹果树,路线不能重复,求一种可行方案。

分析:

当某种匹配可行时蚂蚁所走的距离和是最小的,可以直接用KM算法求二分图最小权值匹配。还有一种做法是先假定一种匹配,如果其中有交叉就进行调整。

代码:

//poj 3565
//sep9
#include <iostream>
#include <cmath>
using namespace std;
const int maxN=128;
const double INF=999999999.0;
double w[maxN][maxN],lx[maxN],ly[maxN],slack[maxN];
int linky[maxN];
int visx[maxN],visy[maxN];
int nx,ny;
double antX[maxN],antY[maxN],appleX[maxN],appleY[maxN];
int ans[maxN];
bool find(int x)
{
	visx[x]=true;
	for(int y=0;y<ny;++y){
		if(visy[y])
			continue;
		double t=lx[x]+ly[y]-w[x][y];
		if(fabs(t)<1e-6){
			visy[y]=true;
			if(linky[y]==-1||find(linky[y])){
				linky[y]=x;
				return true;
			}
		}
		else if(slack[y]>t)
			slack[y]=t;
	}
	return false;
}

int KM()
{
	int i,j;
	memset(linky,-1,sizeof(linky));
	for(i=0;i<nx;++i) ly[i]=0;
	for(i=0;i<nx;++i)
		for(j=0,lx[i]=-INF;j<ny;++j)
			if(w[i][j]>lx[i])
				lx[i]=w[i][j];
	for(int x=0;x<nx;++x){
		for(i=0;i<ny;++i)
			slack[i]=INF;
		while(1){
			memset(visx,0,sizeof(visx));
			memset(visy,0,sizeof(visy));
			if(find(x))
				break;
			double d=INF;
			for(i=0;i<ny;++i)
				if(!visy[i]&&slack[i]<d)
					d=slack[i];
			if(d==INF)
				return -1;
			for(i=0;i<nx;++i)
				if(visx[i])
					lx[i]-=d;
			for(i=0;i<ny;++i)
				if(visy[i])
					ly[i]+=d;
				else
					slack[i]-=d;
		}
	}
	return 0;
}

double dis(double x1,double y1,double x2,double y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

int main()
{
	int n,i,j;
	scanf("%d",&n);
	for(i=0;i<n;++i)
		scanf("%lf%lf",&antX[i],&antY[i]);
	for(i=0;i<n;++i)
		scanf("%lf%lf",&appleX[i],&appleY[i]);
	for(i=0;i<n;++i)
		for(j=0;j<n;++j)
			w[i][j]=-dis(antX[i],antY[i],appleX[j],appleY[j]);
	nx=ny=n;
	KM();
	for(i=0;i<n;++i)
		ans[linky[i]]=i;
	for(i=0;i<n;++i)
		printf("%d\n",ans[i]+1);
	return 0;
} 
时间: 2024-11-06 16:49:19

poj 3565 Ants KM的相关文章

POJ 3565 Ants

Ants Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 356564-bit integer IO format: %lld      Java class name: Main Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on appl

poj3565 Ants km算法求最小权完美匹配,浮点权值

/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求是否存在n条边,每条边恰好连一个白点,一个黑点,且所有的边不相交. 输出所有黑点连接的白点编号. 思路:最小权完美匹配. 假定有白点1(a1,b1), 2(a2,b2), 黑点3(a3,b3),4(a4,b4); 如果1(a1,b1)与3(a3,b3)相连,2(a2,b2)与4(a4,b4)相连,如

【POJ3565】ANTS KM算法

[POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本题用到的结论:当选出的点对之间的距离之和最小时,一定使所有边都不交叉 这个感觉很容易理解,自己画画图就能看出来,就是难想啊 然后跑最小权值匹配,方法是将边权都变成相反数,然后跑最大权值匹配 不知道为什么以前写的KM算法会TLE,将求temp的过程拿到主函数里就过了 #include <cstdio>

UVALive - 4043 Ants (KM裸题)

题目大意:给出N只蚂蚁和N棵树的坐标,问如何完美匹配,才能使蚂蚁到树的连线不会相交 解题思路:KM裸题,但是很郁闷啊 不开根号,用long long竟然过不了,很无语啊,距离最大只有8亿啊 然后用A的double的代码,把他改成了long long ,WA了 然后再用double的A的代码,不开根了,又WA了,这题真坑到底是什么鬼 #include <cstdio> #include <cstring> #include <algorithm> #include <

POJ 1852 Ants

Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15617   Accepted: 6753 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it imm

POJ 1852 Ants 思维题 简单题

Ants Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it immediatelly falls off it. When two ants meet they turn back and start walking in oppos

POJ 1852 Ants 分析

1.暴搜 每只蚂蚁朝向有两种,可以枚举n只蚂蚁的朝向,然后模拟蚂蚁相遇的情景,总共2^n中情况. 2.分析ants相碰的情况: (a->)  (<-b) 变成 (<-a)(b->) 由于每只蚂蚁是相同的,所以等价与(<-b)(a->),这和两只蚂蚁原来的走向是一样的,即把碰撞当作没发生过 所以可以对每一只蚂蚁检查一次就可以了 3.空间优化 存蚂蚁的初始位置O(n),但是我们每次只要比较 a[i] 和 len-a[i] 就可以了,后面不需要这两个值了,所以完全可以用一个x

POJ 1852 Ants (思维技巧 + 贪心)

Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10639   Accepted: 4718 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it imm

poj 1825 Ants 水题

Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10722   Accepted: 4752 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it imm