zoukankan      html  css  js  c++  java
  • [bzoj1601] 灌水

    Description

    Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价。

    Input

    第一行:一个数n

    第二行到第n+1行:第i+1行含有一个数wi

    第n+2行到第2n+1行:第n+1+i行有n个被空格分开的数,第j个数代表pij。

    Output

    第一行:一个单独的数代表最小代价.

    Sample Input

    4
    5
    4
    4
    3
    0 2 2 2
    2 0 3 3
    2 3 0 4
    2 3 4 0
    

    Sample Output

    9
    

    Hint

    Farmer John在第四块土地上建立水库,然后把其他的都连向那一个,这样就要花费3+2+2+2=9

    Source

    [Usaco2008]

    题解

    (0)与所有土地建边,进而将点权转化为了边权,再跑(Prim)求最小生成树,

    由于本题几乎每一个点都有边相连,所以可以用临接矩阵+(Prim)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int N=500,INF=9999999;
    int G[N][N],l[N];
    bool v[N];
    
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i) scanf("%d",&G[0][i]);
    	for(int i=1;i<=n;++i)
    		for(int j=1;j<=n;++j) scanf("%d",&G[i][j]);
    	for(int i=0;i<=n+1;++i) l[i]=INF;
    	l[0]=0;
    	int k;
    	for(int i=0;i<=n;++i)
    	{
    		k=n+1;
    		for(int j=0;j<=n;++j)
    			if((!v[j])&&(l[j]<l[k])) k=j;
    		v[k]=1;
    		for(int j=0;j<=n;++j)
    			if((!v[j])&&(G[k][j]<l[j])) l[j]=G[k][j];
    	}
    	int Ans=0;
    	for(int i=1;i<=n;++i) Ans+=l[i];
    	printf("%d
    ",Ans);
    	return 0;
    }
    

    本文作者:OItby @ https://www.cnblogs.com/hihocoder/

    未经允许,请勿转载。

  • 相关阅读:
    k8s管理
    Docker
    容器技术学习系列(一)-Docker基础知识学习
    Linux系统下DHCP服务安装部署和使用详解
    Linux下配置yum源为阿里云或网易的详解
    一道算法题目(1)
    SS命令和Netstat命令比较
    centos配置redis的主从复制(2)
    centos配置redis的主从复制(1)
    散列表(22)
  • 原文地址:https://www.cnblogs.com/hihocoder/p/11380919.html
Copyright © 2011-2022 走看看