zoukankan      html  css  js  c++  java
  • 1349:【例4-10】最优布线问题

    和1350是同一个题

    地址:http://ybt.ssoier.cn:8088/problem_show.php?pid=1349

    Prim代码:

     1 #include<bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 using namespace std;
     4 
     5 int n,u,ans;
     6 int mp[105][105];//图(邻接矩阵) 
     7 int d[105];//最短距离 
     8 bool vis[105];//访问标记 
     9 
    10 void prim(){//核心代码 
    11     for(int i=1;i<=n;i++){
    12         d[i]=INF;
    13     }
    14     d[1]=0;
    15     for(int i=1;i<=n;i++){
    16         int u=-1,MIN=INF;
    17         for(int j=1;j<=n;j++){
    18             if(vis[j]==0 && d[j]<MIN){
    19                 u=j;
    20                 MIN=d[j];
    21             }
    22         }
    23         vis[u]=1;
    24         ans+=d[u];
    25         for(int v=1;v<=n;v++){
    26             if(vis[v]==0 && mp[u][v]!=INF && mp[u][v]<d[v]){
    27                 d[v]=mp[u][v];
    28             }
    29         }
    30     }
    31 }
    32 
    33 int main(){
    34     cin>>n;
    35     for(int i=1;i<=n;i++){
    36         for(int j=1;j<=n;j++){
    37             cin>>mp[i][j];
    38         }
    39     }
    40     prim();
    41     cout<<ans;
    42     return 0;
    43 }

    Kruskal代码:

     1 #include<bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 using namespace std;
     4 
     5 int n,m,num,sum;
     6 bool boo[105][105];
     7 struct edge{
     8     int a,b,c;
     9 }mp[90005];
    10 
    11 bool cmp(edge a,edge b){
    12     return a.c<b.c;
    13 }
    14 
    15 int father[305];
    16 int findfather(int x){
    17     if(father[x]!=x) father[x]=findfather(father[x]);
    18     else return father[x];
    19 }
    20 
    21 void kruskal(int n,int m){
    22     num=0;
    23     for(int i=1;i<=n;i++){
    24         father[i]=i;
    25     }
    26     sort(mp+1,mp+m+1,cmp);
    27 //    for(int i=1;i<=m;i++) cout<<mp[i].a<<" "<<mp[i].b<<endl;
    28     for(int i=1;i<=m;i++){
    29         if(findfather(mp[i].a)!=findfather(mp[i].b)){
    30             father[findfather(mp[i].a)]=findfather(mp[i].b);
    31             num++;
    32             sum+=mp[i].c;
    33             if(num==n-1) break;
    34         }
    35     }
    36 }
    37 
    38 int main(){
    39     cin>>n;
    40     int m=pow(n,2);
    41     int k=0;
    42     for(int i=1;i<=n;i++){
    43         for(int j=1;j<=n;j++){
    44             int temp;
    45             cin>>temp;        
    46             if(boo[i][j]==0 && i!=j){
    47                 k++;
    48                 mp[k].a=i;
    49                 mp[k].b=j;
    50                 mp[k].c=temp;
    51                 boo[j][i]=1;
    52                 if(temp==0) mp[k].c=INF;                
    53             }
    54         }
    55     }
    56     kruskal(n,k);
    57     cout<<sum;
    58     return 0;
    59 }
  • 相关阅读:
    关于jQuery动态多次绑定的问题及解决
    零基础英文盲打的建议
    29道Java简答题
    Redis分布式锁的实现(纯文字)
    小程序三级联动(动态获取数据)
    sql中按in中的ID进行排序输出
    layui中对表格操作按钮集的判断
    Linq改进
    C#前台直接调用后台数据时,<p>或双引号出现转义的问题
    sql 中sum函数返回null的解决方案
  • 原文地址:https://www.cnblogs.com/Wag-Ho/p/14640441.html
Copyright © 2011-2022 走看看