zoukankan      html  css  js  c++  java
  • [图论]最优布线问题:prim

    最优布线问题


    Description

    学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。
    当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。
    现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。


    Input

    输入文件wire.in,第一行为整数n(2<=n<=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。


    Output

    输出文件wire.out,一个整数,表示最小的连接费用。


    Sample Input

    3
    0 1 2
    1 0 1
    2 1 0


    Sample Output

    2(注:表示连接1和2,2和3,费用为2)


    Hint

    Fillchar(f,sizeof(f),$7f)把所有值赋值为最大


    解析

    这道题一看就是最小生成树,有两种方法,分别为
    普里姆算法(prim

    克鲁斯卡尔(kruskal
    本题解使用的是 prim
    Prim算法采用与DijkstraBellman-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点。


    代码

    %:pragma GCC optimize(2)
    %:pragma GCC optimize(3)
    %:pragma GCC optimize("Ofast")
    %:pragma GCC optimize("inline")
    %:pragma GCC optimize("-fgcse")
    %:pragma GCC optimize("-fgcse-lm")
    %:pragma GCC optimize("-fipa-sra")
    %:pragma GCC optimize("-ftree-pre")
    %:pragma GCC optimize("-ftree-vrp")
    %:pragma GCC optimize("-fpeephole2")
    %:pragma GCC optimize("-ffast-math")
    %:pragma GCC optimize("-fsched-spec")
    %:pragma GCC optimize("unroll-loops")
    %:pragma GCC optimize("-falign-jumps")
    %:pragma GCC optimize("-falign-loops")
    %:pragma GCC optimize("-falign-labels")
    %:pragma GCC optimize("-fdevirtualize")
    %:pragma GCC optimize("-fcaller-saves")
    %:pragma GCC optimize("-fcrossjumping")
    %:pragma GCC optimize("-fthread-jumps")
    %:pragma GCC optimize("-funroll-loops")
    %:pragma GCC optimize("-fwhole-program")
    %:pragma GCC optimize("-freorder-blocks")
    %:pragma GCC optimize("-fschedule-insns")
    %:pragma GCC optimize("inline-functions")
    %:pragma GCC optimize("-ftree-tail-merge")
    %:pragma GCC optimize("-fschedule-insns2")
    %:pragma GCC optimize("-fstrict-aliasing")
    %:pragma GCC optimize("-fstrict-overflow")
    %:pragma GCC optimize("-falign-functions")
    %:pragma GCC optimize("-fcse-skip-blocks")
    %:pragma GCC optimize("-fcse-follow-jumps")
    %:pragma GCC optimize("-fsched-interblock")
    %:pragma GCC optimize("-fpartial-inlining")
    %:pragma GCC optimize("no-stack-protector")
    %:pragma GCC optimize("-freorder-functions")
    %:pragma GCC optimize("-findirect-inlining")
    %:pragma GCC optimize("-fhoist-adjacent-loads")
    %:pragma GCC optimize("-frerun-cse-after-loop")
    %:pragma GCC optimize("inline-small-functions")
    %:pragma GCC optimize("-finline-small-functions")
    %:pragma GCC optimize("-ftree-switch-conversion")
    %:pragma GCC optimize("-foptimize-sibling-calls")
    %:pragma GCC optimize("-fexpensive-optimizations")
    %:pragma GCC optimize("-funsafe-loop-optimizations")
    %:pragma GCC optimize("inline-functions-called-once")
    %:pragma GCC optimize("-fdelete-null-pointer-checks")
    #include<iostream>
    #include<stdio.h>
    #include<string.h> 
    #define sr register short
    #define su unsigned short
    #define r register int
    #define intt unsigned int
    #define ll long long
    #define llr register long long
    #define llu unsigned long long
    #define lf double
    #define Lf long double
    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize("Ofast")
    #pragma GCC optimize("inline")
    #pragma GCC optimize("-fgcse")
    #pragma GCC optimize("-fgcse-lm")
    #pragma GCC optimize("-fipa-sra")
    #pragma GCC optimize("-ftree-pre")
    #pragma GCC optimize("-ftree-vrp")
    #pragma GCC optimize("-fpeephole2")
    #pragma GCC optimize("-ffast-math")
    #pragma GCC optimize("-fsched-spec")
    #pragma GCC optimize("unroll-loops")
    #pragma GCC optimize("-falign-jumps")
    #pragma GCC optimize("-falign-loops")
    #pragma GCC optimize("-falign-labels")
    #pragma GCC optimize("-fdevirtualize")
    #pragma GCC optimize("-fcaller-saves")
    #pragma GCC optimize("-fcrossjumping")
    #pragma GCC optimize("-fthread-jumps")
    #pragma GCC optimize("-funroll-loops")
    #pragma GCC optimize("-fwhole-program")
    #pragma GCC optimize("-freorder-blocks")
    #pragma GCC optimize("-fschedule-insns")
    #pragma GCC optimize("inline-functions")
    #pragma GCC optimize("-ftree-tail-merge")
    #pragma GCC optimize("-fschedule-insns2")
    #pragma GCC optimize("-fstrict-aliasing")
    #pragma GCC optimize("-fstrict-overflow")
    #pragma GCC optimize("-falign-functions")
    #pragma GCC optimize("-fcse-skip-blocks")
    #pragma GCC optimize("-fcse-follow-jumps")
    #pragma GCC optimize("-fsched-interblock")
    #pragma GCC optimize("-fpartial-inlining")
    #pragma GCC optimize("no-stack-protector")
    #pragma GCC optimize("-freorder-functions")
    #pragma GCC optimize("-findirect-inlining")
    #pragma GCC optimize("-fhoist-adjacent-loads")
    #pragma GCC optimize("-frerun-cse-after-loop")
    #pragma GCC optimize("inline-small-functions")
    #pragma GCC optimize("-finline-small-functions")
    #pragma GCC optimize("-ftree-switch-conversion")
    #pragma GCC optimize("-foptimize-sibling-calls")
    #pragma GCC optimize("-fexpensive-optimizations")
    #pragma GCC optimize("-funsafe-loop-optimizations")
    #pragma GCC optimize("inline-functions-called-once")
    #pragma GCC optimize("-fdelete-null-pointer-checks")
    using namespace std;
    __attribute__((optimize("-O2")))
    __attribute__((optimize("-O3")))
    __attribute__((optimize("Ofast")))
    __attribute__((optimize("inline")))
    __attribute__((optimize("-fgcse")))
    __attribute__((optimize("-fgcse-lm")))
    __attribute__((optimize("-fipa-sra")))
    __attribute__((optimize("-ftree-pre")))
    __attribute__((optimize("-ftree-vrp")))
    __attribute__((optimize("-fpeephole2")))
    __attribute__((optimize("-ffast-math")))
    __attribute__((optimize("-fsched-spec")))
    __attribute__((optimize("unroll-loops")))
    __attribute__((optimize("-falign-jumps")))
    __attribute__((optimize("-falign-loops")))
    __attribute__((optimize("-falign-labels")))
    __attribute__((optimize("-fdevirtualize")))
    __attribute__((optimize("-fcaller-saves")))
    __attribute__((optimize("-fcrossjumping")))
    __attribute__((optimize("-fthread-jumps")))
    __attribute__((optimize("-funroll-loops")))
    __attribute__((optimize("-fwhole-program")))
    __attribute__((optimize("-freorder-blocks")))
    __attribute__((optimize("-fschedule-insns")))
    __attribute__((optimize("inline-functions")))
    __attribute__((optimize("-ftree-tail-merge")))
    __attribute__((optimize("-fschedule-insns2")))
    __attribute__((optimize("-fstrict-aliasing")))
    __attribute__((optimize("-fstrict-overflow")))
    __attribute__((optimize("-falign-functions")))
    __attribute__((optimize("-fcse-skip-blocks")))
    __attribute__((optimize("-fcse-follow-jumps")))
    __attribute__((optimize("-fsched-interblock")))
    __attribute__((optimize("-fpartial-inlining")))
    __attribute__((optimize("no-stack-protector")))
    __attribute__((optimize("-freorder-functions")))
    __attribute__((optimize("-findirect-inlining")))
    __attribute__((optimize("-fhoist-adjacent-loads")))
    __attribute__((optimize("-frerun-cse-after-loop")))
    __attribute__((optimize("inline-small-functions")))
    __attribute__((optimize("-finline-small-functions")))
    __attribute__((optimize("-ftree-switch-conversion")))
    __attribute__((optimize("-foptimize-sibling-calls")))
    __attribute__((optimize("-fexpensive-optimizations")))
    __attribute__((optimize("-funsafe-loop-optimizations")))
    __attribute__((optimize("inline-functions-called-once")))
    __attribute__((optimize("-fdelete-null-pointer-checks"))) //以上是超级无敌大优化外加头文件,不用去理它
    int n,o,a[1005][105],u[105],minn[105],ans; //a是连接矩阵,u是判断是蓝点(1)或白点(0),minn是最小生成树的最小边权
    int main(){ //prim是以1为起点
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			scanf("%d",&a[i][j]);
    	memset(minn,0x7f,sizeof(minn)); //把minn全部改为maxint
    	minn[1]=0; //唯有minn[1]是0,因为自己到自己的距离为0
    	memset(u,1,sizeof(u)); //全部标记为1(蓝点)
    	for(int i=1;i<=n;i++){
    		o=0; 
    		for(int j=1;j<=n;j++)
    			if(u[j] and (minn[j]<minn[o])) //u[j]判断这个点是不是蓝点,再看是是不是最小边权
    				o=j;
    		u[o]=0; //加入最小生成树,标记为白点
    		for(int j=1;j<=n;j++)
    			if(u[j] and (a[o][j]<minn[j])){ //修改和o相连的白点的边
    				minn[j]=a[o][j];
    			}
    				
    	}
    	for(int i=1;i<=n;i++)
    		ans+=minn[i]; //累加每一条边的权值
    	printf("%d",ans);
    	return 0;
    } 
    
  • 相关阅读:
    mysql的统计函数(聚合函数)
    mysql中的五子查询
    mysql-蠕虫复制--快速插入数据
    mysql 外键的使用
    我的mysql入门笔记
    阿里云官方 Centos7 源码安装 LAMP环境
    xml格式数据转excel
    mysql的安装配置
    sublime中,怎么把所有的函数代码都折叠起来?
    点击文字或按钮弹出一个DIV窗口(DIV悬浮窗口)
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300155.html
Copyright © 2011-2022 走看看