现在的位置: 首页 > 综合 > 正文

poj 3164 Command Network

2018年12月29日 ⁄ 综合 ⁄ 共 1238字 ⁄ 字号 评论关闭

最小树形图,,不熟练啊,写错几个地方无限TLE

 

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 101
#define inf 0x3fffffff
int flag[N],id[N],pre[N],n,m;
double ms[N];
struct op
{
	int x,y;
	double w;
}e[N*N];
struct tp
{
	double x,y;
}p[N];
double dis(struct tp a,struct tp b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double liuzhu(int root)
{
	int i,j,nm=n+1;
	double sum=0;
	while(1)
	{
		memset(flag,-1,sizeof(flag));
		memset(id,-1,sizeof(id));
		memset(pre,-1,sizeof(pre));
		for(i=1;i<nm;i++)
			ms[i]=inf;
		for(i=0;i<m;i++)
		{
			int x=e[i].x,y=e[i].y;
			double w=e[i].w;
			if(y!=x&&ms[y]>w)
			{
				ms[y]=w;
				pre[y]=x;
			}
		}
		ms[root]=0;pre[root]=root;
		for(i=1;i<nm;i++)
		{
			if(ms[i]==inf)return -1.0;
			sum+=ms[i];
		}
		int res=1;
		for(i=1;i<nm;i++)
		{
			if(flag[i]==-1)
			{
				int u=i;
				while(flag[u]==-1)
				{
					flag[u]=i;
					u=pre[u];
				}
				if(u==root||flag[u]!=i)continue;
				for(int t=pre[u];t!=u;t=pre[t])
					id[t]=res;
				id[u]=res++;
			}
		}
		if(res==1)break;
		for(i=1;i<nm;i++)
			if(id[i]==-1)id[i]=res++;
			for(i=0;i<m;i++)
			{
				e[i].w-=ms[e[i].y];
				e[i].x=id[e[i].x];
				e[i].y=id[e[i].y];
			}
			root=id[root];
			nm=res;
	}
	return sum;
}
int main()
{
	int i,x,a,b,j;
	double sum;
	while(scanf("%d%d",&n,&m)!=-1)
	{
	   for(i=1;i<=n;i++)
		   scanf("%lf%lf",&p[i].x,&p[i].y);
	   for(i=0;i<m;i++)
	   {
		   scanf("%d%d",&a,&b);
		   e[i].x=a;
		   e[i].y=b;
		   e[i].w=dis(p[a],p[b]);
	   }
	   sum=liuzhu(1);
	   if(sum<0)printf("poor snoopy\n");
	   else printf("%.2f\n",sum);
	}
	return 0;
}

抱歉!评论已关闭.