最小匹配hdu 3991 Harry Potter and the Present II

最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--最小匹配

    最小径路盖覆,用floyd求最短路,注意匹配时定点不是n个而是Q个,每一个都会可能有多个人须要物礼

    把每一个点根据间时排下序得免超时

    每日一道理
“一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1010
#define inf 0x3fffffff
int map[N][N],tch[N],link[N],match[N],n;
bool mp[N][N];
struct op
{
	int x,t;
}p[1010];
int cmp(const void *a,const void *b)
{
	struct op *c,*d;
	c=(struct op *)a;
	d=(struct op *)b;
	if(c->t!=d->t)
		return c->t-d->t;
	return c->x-d->x;
}
int find(int u)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(!link[i]&&mp[u][i])
		{
			link[i]=1;
			if(match[i]==-1||find(match[i]))
			{
				match[i]=u;
				tch[u]=i;
				return 1;
			}
		}
	}
	return 0;
}
void floyd()
{
	int i,j,k;
	for(k=0;k<n;k++)
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)				
				if(map[i][j]>map[i][k]+map[k][j])
					map[i][j]=map[i][k]+map[k][j];
}
int main()
{
	int i,j,k,T,sum,m,Q,x,y,c,op=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&Q);
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
				map[i][j]=inf;
			map[i][i]=0;
		}
		memset(mp,false,sizeof(mp));
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&x,&y,&c);
			if(map[x][y]>c)
				map[x][y]=map[y][x]=c;
		}
		floyd();
		for(i=0;i<Q;i++)
			scanf("%d%d",&p[i].x,&p[i].t);
        qsort(p,Q,sizeof(p[0]),cmp);
		for(i=0;i<Q;i++)
			for(j=i+1;j<Q;j++)
			{
				if(p[j].t-p[i].t>=map[p[i].x][p[j].x])
					mp[i][j]=true;
			}
			sum=0;
			n=Q;
			memset(match,-1,sizeof(match));
			memset(tch,-1,sizeof(tch));
			for(i=0;i<Q;i++)
			{
				if(tch[i]!=-1)continue;
				memset(link,0,sizeof(link));
				sum+=find(i);
			}
			printf("Case %d: ",op++);
			printf("%d\n",n-sum-1);
	}
	return 0;
}

    
 

文章结束给大家分享下程序员的一些笑话语录: 女人篇
  有的女人就是Windows虽然很优秀,但是安全隐患太大。
  有的女人就是MFC她条件很好,然而不是谁都能玩的起。
  有的女人就是C#长的很漂亮,但是家务活不行。
  有的女人就是C++,她会默默的为你做很多的事情。
  有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
  有的女人就是SQL,她会为你的发展带来莫大的帮助。

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3036548.html