zoukankan      html  css  js  c++  java
  • 2627 村村通

    2627 村村通

     

    时间限制: 1 s
    空间限制: 32000 KB
    题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

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

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

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    4
    0 4 9 21
    4 0 8 17
    9 8 0 16
    21 17 16 0

    样例输出 Sample Output

    28

    数据范围及提示 Data Size & Hint

    暂时无范围。

    prim算法:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 bool vis[1001];
     6 int a[1001][1001],minn[1001];
     7 int main()
     8 {
     9     int n;
    10     scanf("%d",&n);
    11     for(int i=1;i<=n;i++)
    12     for(int j=1;j<=n;j++)
    13     {
    14         cin>>a[i][j];
    15     }
    16     memset(minn,999999,sizeof(minn));memset(vis,1,sizeof(vis));
    17     minn[1]=0;
    18     
    19     for(int i=1;i<=n;i++)
    20     {
    21         int k=0;
    22         for(int j=1;j<=n;j++)
    23             if(vis[j]&&minn[j]<minn[k])
    24             k=j;
    25         vis[k]=0;
    26         for(int j=1;j<=n;j++)
    27         {
    28             if(vis[j]&&minn[j]>a[k][j])
    29             {
    30                 minn[j]=a[k][j];
    31             }
    32         }
    33     }
    34     int ans=0;
    35     for(int i=1;i<=n;i++)
    36     {
    37         ans+=minn[i];
    38     }
    39     cout<<ans;
    40 }
    Kruskal算法:
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 using namespace std;
     5 struct node{
     6     int x;
     7     int y;
     8     int v;
     9     bool operator < (const node &aa)const
    10     {
    11               if(v<aa.v)return 1;
    12             else return 0;    
    13     }
    14 }a[10001];
    15 int father[100001];
    16 int find(int x){
    17     if(father[x]!=x) father[x]=find(father[x]);
    18     return father[x];
    19 }
    20 void unionn(int x,int y)
    21 {
    22     int fa=find(x);
    23     int fb=find(y);
    24     if(fa!=fb)father[fa]=fb;
    25     //if(find(x)!=find(y))father[find(x)]=father[find(y)];
    26 }
    27 int num=0;
    28 int main()
    29 {
    30     int n,m=0,x;
    31     scanf("%d",&n);
    32     for(int i=1;i<=n;i++)
    33     for(int j=1;j<=n;j++)
    34     {
    35         cin>>x;
    36         if(x!=0)
    37         {
    38             m++;
    39             a[++num].x=i;
    40             a[num].y=j;
    41             a[num].v=x;
    42         }
    43     }
    44     int tot=0,k=0;
    45     for(int i=1;i<=n;i++)
    46     father[i]=i;
    47     sort(a+1,a+m+1);
    48     for(int i=1;i<=m;i++)
    49     {
    50         if(find(a[i].x)!=find(a[i].y))
    51         {
    52             unionn(a[i].x,a[i].y);
    53             tot+=a[i].v;
    54             k++;
    55         }
    56         if(k==n-1)break;
    57     }
    58     cout<<tot<<endl;
    59     return 0;
    60 }
     
  • 相关阅读:
    右键菜单:锁到任务栏丢失 修复
    检测到鼠标时自动禁用触摸板 (注:仅适用于个别笔记本)
    清除右键菜单CMD入口
    VBS编辑字段
    VBS创建数据表
    VBS创建数据库
    QTP操作论坛回复编辑框----webelement
    数字排序
    对应键盘的ASCII码(备忘)
    将字符串打乱输出
  • 原文地址:https://www.cnblogs.com/sssy/p/6706194.html
Copyright © 2011-2022 走看看