• P1546 最短网络 Agri-Net


    P1546 最短网络 Agri-Net

    题目背景

    农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。

    题目描述

    约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。

    你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

    输入输出格式

    输入格式:

    第一行: 农场的个数,N(3<=N<=100)。

    第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

    输出格式:

    只有一个输出,其中包含连接到每个农场的光纤的最小长度。

    输入输出样例

    输入样例#1:
    4
    0 4 9 21
    4 0 8 17
    9 8 0 16
    21 17 16 0
    输出样例#1:
    28

    说明

    题目翻译来自NOCOW。

    USACO Training Section 3.1

    分析:

    最简单的最小生成树

    1、prim算法

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 int a[105][105],n,vis[105],ans=0,dis[105];
     5 
     6 //我这里是思路错了,是集合a到集合b的最短距离,
     7 //而不是新选的这个点到集合b的最短距离 
     8 int main(){
     9     //freopen("in.txt","r",stdin);
    10     memset(dis,0x3f,sizeof(dis));
    11     cin>>n;
    12     for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];
    13     vis[1]=true;
    14     for(int i=1;i<=n;i++) dis[i]=a[1][i];
    15     for(int k=1;k<=n-1;k++){
    16         int p=0;
    17         for(int i=1;i<=n;i++){
    18             if(!vis[i]&&dis[p]>dis[i]) p=i;//又把这里的vis写成了dis 
    19         }
    20         vis[p]=true;
    21         ans+=dis[p];
    22         for(int i=1;i<=n;i++){
    23             if(!vis[i]&&a[p][i]<dis[i]) dis[i]=a[p][i];//这里的!vis[i]也忘记写了 
    24         }
    25     } 
    26     cout<<ans<<endl;
    27     
    28     return 0;
    29 } 

    写这么一个简单的算法居然写错了三个位置,坑死我了

    1、

    错误代码:

    算了,不贴了

    2、3、

    4、注意点

    2、kruskal

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 struct node{
     5     int u,v,w;
     6     bool operator <(const node &p1) const{
     7         return this->w<p1.w;
     8     }
     9 }edge[(105*105)/2];//错误2:这里的edge开小了,开了105 
    10 //cnt代表边的数目,要有 
    11 int n,cnt,fa[105],ans=0;
    12 //kruskal只需要存边,不需要存邻接图 
    13 //kruskal或者说最小生成树里面都是无向边 
    14 
    15 int find(int x){
    16     if(x==fa[x]) return x;//错误1:这里的等于号写成了赋值号,找了半天错 
    17     else return fa[x]=find(fa[x]);
    18 }
    19 
    20 void kruskal(){
    21     sort(edge+1,edge+cnt+1);
    22     for(int i=1;i<=n;i++) fa[i]=i;
    23     for(int i=1;i<=cnt;i++){
    24         int x=find(edge[i].u);
    25         int y=find(edge[i].v);
    26         if(x!=y){
    27             ans+=edge[i].w;
    28             fa[x]=y;
    29         }  
    30     } 
    31 }
    32 
    33 int main(){
    34     //freopen("in.txt","r",stdin);
    35     //freopen("testdata.in","r",stdin);
    36     cin>>n;
    37     for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
    38         int w;cin>>w;
    39         if(i!=j){
    40             edge[++cnt].u=i;
    41             edge[cnt].v=j;
    42             edge[cnt].w=w; 
    43         }
    44     }
    45     kruskal();
    46     cout<<ans<<endl;
    47     return 0;
    48 } 

    这个kruskal也是写错了很多位置,真心伤不起

    1、

    2、

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7618258.html
Copyright © 2020-2023  润新知