zoukankan      html  css  js  c++  java
  • P1265 公路修建 最小生成树

    题意:

    (一句话题意的话,这题就不用做了)

    某国有n个城市,它们互相之间没有公路相通,因此交通十分不便。为解决这一“行路难”的问题,政府决定修建公路。修建公路的任务由各城市共同完成。

    修建工程分若干轮完成。在每一轮中,每个城市选择一个与它最近的城市,申请修建通往该城市的公路。政府负责审批这些申请以决定是否同意修建。

    政府审批的规则如下:

    (1)如果两个或以上城市申请修建同一条公路,则让它们共同修建;

    (2)如果三个或以上的城市申请修建的公路成环。如下图,A申请修建公路AB,B申请修建公路BC,C申请修建公路CA。则政府将否决其中最短的一条公路的修建申请;

    img

    (3)其他情况的申请一律同意。

    一轮修建结束后,可能会有若干城市可以通过公路直接或间接相连。这些可以互相:连通的城市即组成“城市联盟”。在下一轮修建中,每个“城市联盟”将被看作一个城市,发挥一个城市的作用。

    当所有城市被组合成一个“城市联盟”时,修建工程也就完成了。

    你的任务是根据城市的分布和前面讲到的规则,计算出将要修建的公路总长度。

    范围&性质:\(1\le n\le 5000\)

    分析:

    除了第二种情况以外,别的显然是最小生成树的性质,那么我们考虑第二种情况,由于每个城市都申请修建离自己最近的一条,所以成环的本质就是存在三个或以上的城市两两距离相等,此时每一条都可以看成最短的,也不影响最小生成树

    tips:由于两两城市之间都有一条边,形成了一个完全图,所以采用prim算法,但是又因为n过大,邻接矩阵存不下,所以在prim更新的时候再算一下距离(我就这样MLE了几次

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    namespace zzc
    {
    	const double inf = 1e8;
    	const int maxn = 5e3+5;
    	int n,st,cnt=0;
    	double dis[maxn],ans=0;
    	bool vis[maxn];
    	
    	struct node
    	{
    		int x,y;
    	}a[maxn];
    
    	double calc(int s,int t)
    	{
    		return sqrt( (double)(a[s].x-a[t].x)*(a[s].x-a[t].x)+(double)(a[s].y-a[t].y)*(a[s].y-a[t].y) );
    	}
    	
    	void prim()
    	{
    		for(int i=1;i<=n;i++)
    		{
    			dis[i]=inf;
    		}
    		dis[1]=0;
    		for(int k=1;k<=n;k++)
    		{
    			int cnt=-1;
    			double mx=inf;
    			for(int i=1;i<=n;i++)
    			{
    				if(vis[i]==false&&dis[i]<mx)
    				{
    					mx=dis[i];
    					cnt=i;
    				}
    			}
    			ans+=mx;
    			vis[cnt]=true;
    			for(int i=1;i<=n;i++)
    			{
    				double tmp=calc(cnt,i);
    				if(dis[i]>tmp)
    				{
    					dis[i]=tmp;
    				}
    			}
    		}
    	}
    	
    	void work()
    	{
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d%d",&a[i].x,&a[i].y);
    		}
    		prim();
    		printf("%.2lf",ans);
    	}
    	
     } 
     
     int main()
     {
     	zzc::work();
     	return 0;
     }
     
    
  • 相关阅读:
    121-基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 机器人主板
    BJSV-P-004无缝大屏显示
    BJSV-P-003高清智能卡口系统
    BJSV-P-002高精度测速一体机
    新一代高清智能电子警察系统
    135-基于TMS320C6678、FPGA XC5VSX95T的2路Full模式Camera Link输入双目视觉处理平台
    175-基于TI DSP TMS320C6455、Xilinx V5 FPGA XC5VSX95T的高速数据处理核心板
    137-基于TMS320C6678、FPGA XC5VSX95T的四路Base模式全景影像处理平台
    134-基于TMS320C6678、FPGA XC5VSX95T的一路Full模式Camera Link图像理平台
    如何连接宏参数
  • 原文地址:https://www.cnblogs.com/youth518/p/13678084.html
Copyright © 2011-2022 走看看