zoukankan      html  css  js  c++  java
  • POJ 2421 Constructing Roads 解题报告

    题意:给定n个村庄  然后给你一个n*n 的矩阵代表的是各个村庄的距离,然后给你q对数,代表已经有哪些村庄已经联通,问你能将所有村庄联通需要的最短长度

    解题思路:最开始一直以为是prime算法,后来才想到这先连通的树有可能不是在一个集合里面,所以用Kruskal 算法  后来又因为数组开小了而wa了  ,最小生成树还是很耗费内存的,,

    代码

    Kruskal
    // File Name: f1.cpp
    // Author: darkdream
    // Created Time: 2013年04月23日 星期二 18时24分48秒
    
    #include<vector>
    #include<list>
    #include<map>
    #include<set>
    #include<deque>
    #include<stack>
    #include<bitset>
    #include<algorithm>
    #include<functional>
    #include<numeric>
    #include<utility>
    #include<sstream>
    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<ctime>
    
    using namespace std;
    //int set[105];
    int a[105][105];
    int w[10005];
    int p[10005];
    int u[10005];
    int v[10005];
    int r[10005];
    int find(int x)
    {
       return p[x] == x? x :p[x] = find(p[x]); 
    }
    int cmp(const int i , const int j ) {
      return w[i] < w[j];
    }
    int main(){
       int n;
       freopen("/home/plac/problem/input.txt","r",stdin);
       while(scanf("%d",&n) != EOF)
       {
          memset(a,0,sizeof(a));
          memset(w,0,sizeof(w));
          memset(p,0,sizeof(p));
          memset(u,0,sizeof(u));
          memset(v,0,sizeof(v));
          memset(r,0,sizeof(r));
    
          for(int i =1 ;i <= n;i ++)
              for(int j = 1;j <= n;j ++)
                  scanf("%d",&a[i][j]);
          int q ;
          scanf("%d",&q);
          for(int i =1; i<= n;i ++)
              p[i] = i;
      
          for(int i = 1;i <= q; i ++)
          {
             int tempa,tempb;
             scanf("%d %d",&tempa,&tempb);
             if(tempa == tempb)
                 continue;
             //find(tempa);
             if(find(tempa) != find(tempb))
                {
                   p[find(tempb)] = find(tempa);
                }
             //find(tempa);
             //for(int i = 1;i <= n;i ++)
            //  printf("%d ",p[i]);
          //printf("\n");
          }
          int s = 0 ;
          for(int i =2 ;i <= n; i ++)
            for(int j = 1;  j < i; j ++)
            {
              v[++s] = i;
              u[s] = j;
              w[s] = a[i][j];
            }
          //printf("%d************ %d\n",v[117],u[117]);
          for(int k = 1 ;k <= s; k++)
          { 
              r[k] = k ;
          }
          sort(r+1,r+s+1,cmp);
          //for(int i = 1;i <= s;i ++)
            //  printf("%d %d %d %d\n",r[i],v[r[i]],u[r[i]],w[r[i]]);
          //printf("%d************ %d\n",v[117],u[117]);
          int ans = 0;
          for(int i = 1;i <= s; i ++)
          {
              int e = r[i];
              
              int x = find(u[e]) ; int y = find(v[e]);
              if(x != y) {ans += w[e]; p[x] = y;
                 // printf("%d %d %d\n",e,v[e],u[e]);
                  //for(int j = 1;j <= n; j ++ )
                    //printf("%d ",p[j]);
                  //printf("\n");
              }
          }
          printf("%d\n",ans);
       }
    return 0;
    }
  • 相关阅读:
    Android开发 使用 adb logcat 显示 Android 日志
    【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    C语言 结构体相关 函数 指针 数组
    C语言 命令行参数 函数指针 gdb调试
    C语言 指针数组 多维数组
    Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
    C语言 内存分配 地址 指针 数组 参数 实例解析
    CRT 环境变量注意事项
    hadoop 输出文件 key val 分隔符
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
  • 原文地址:https://www.cnblogs.com/zyue/p/3040979.html
Copyright © 2011-2022 走看看