zoukankan      html  css  js  c++  java
  • POJ1287 || ZOJ1372 kruskal

    题意:求连接所有地点是网线长度最短

    分析:kruskal。

    一开始数组开小了 导致re了几次,然后开大后有wa 了几次,郁闷的去取了快递,吃了饭。回来在检查发现parent[]这边又出问题 了。应该是

    for(int i=1;i<=n;i++){

                path[i]=-1;

    }

    而不是下标从0 到n-1.嗨。。。

    View Code
      1 // I'm the Topcoder
      2 //C
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <string.h>
      6 #include <ctype.h>
      7 #include <math.h>
      8 #include <time.h>
      9 //C++
     10 #include <iostream>
     11 #include <algorithm>
     12 #include <cstdio>
     13 #include <cstdlib>
     14 #include <cmath>
     15 #include <cstring>
     16 #include <cctype>
     17 #include <stack>
     18 #include <string>
     19 #include <list>
     20 #include <queue>
     21 #include <map>
     22 #include <vector>
     23 #include <deque>
     24 #include <set>
     25 using namespace std;
     26 
     27 //*************************OUTPUT*************************
     28 #ifdef WIN32
     29 #define INT64 "%I64d"
     30 #define UINT64 "%I64u"
     31 #else
     32 #define INT64 "%lld"
     33 #define UINT64 "%llu"
     34 #endif
     35 
     36 //**************************CONSTANT***********************
     37 #define INF 0x3f3f3f3f
     38 #define eps 1e-8
     39 #define PI acos(-1.)
     40 #define PI2 asin (1.);
     41 typedef long long LL;
     42 //typedef __int64 LL;   //codeforces
     43 typedef unsigned int ui;
     44 typedef unsigned long long ui64;
     45 #define MP make_pair
     46 typedef vector<int> VI;
     47 typedef pair<int, int> PII;
     48 #define pb push_back
     49 #define mp make_pair
     50 
     51 //***************************SENTENCE************************
     52 #define CL(a,b) memset (a, b, sizeof (a))
     53 #define sqr(a,b) sqrt ((double)(a)*(a) + (double)(b)*(b))
     54 #define sqr3(a,b,c) sqrt((double)(a)*(a) + (double)(b)*(b) + (double)(c)*(c))
     55 
     56 //****************************FUNCTION************************
     57 template <typename T> double DIS(T va, T vb) { return sqr(va.x - vb.x, va.y - vb.y); }
     58 template <class T> inline T INTEGER_LEN(T v) { int len = 1; while (v /= 10) ++len; return len; }
     59 template <typename T> inline T square(T va, T vb) { return va * va + vb * vb; }
     60 
     61 // aply for the memory of the stack
     62 //#pragma comment (linker, "/STACK:1024000000,1024000000")
     63 //end
     64 
     65 int n,m,mi;
     66 #define maxn 50000+10
     67 int pa[maxn];
     68 int num=0;
     69 int sumweight=0;
     70 
     71 struct node{
     72     int u,v,w;
     73 }edges[maxn];
     74 
     75 //初始化
     76 void UFset(){
     77     for(int i=1;i<=n;i++){//下标从1开始,wa了好几次。。。
     78         pa[i]=-1;
     79     }
     80 }
     81 
     82 //查找
     83 int findset(int x){
     84     int s;
     85     for(s=x;pa[s]>=0;s=pa[s]);
     86     while(s!=x){
     87         int tmp=pa[x];
     88         pa[x]=s;
     89         x=tmp;
     90     }
     91     return s;
     92 }
     93 
     94 //合并
     95 void Union(int R1,int R2){
     96     int r1=findset(R1),r2=findset(R2);
     97     int tmp=pa[r1]+pa[r2];
     98     if(pa[r1]>pa[r2]){
     99         pa[r1]=r2;
    100         pa[r2]=tmp;
    101     }
    102     else {
    103         pa[r2]=r1;
    104         pa[r1]=tmp;
    105     }
    106 }
    107 
    108 
    109 int cmp(const void*a,const void*b){
    110     node aa=*(const node*)a;
    111     node bb=*(const node*)b;
    112     if(aa.w>bb.w) return 1;
    113     else return -1;
    114 }
    115 
    116 void Kruskal(){
    117     int u,v;
    118     UFset();
    119     num=0;
    120     for(int i=0;i<m;i++)
    121     {
    122         u=edges[i].u; v=edges[i].v;
    123         if(findset(u)!=findset(v)){
    124             sumweight+=edges[i].w;
    125             num++;
    126             Union(u,v);
    127         }
    128         if(num>=n-1) break;
    129     }
    130 }
    131 
    132 int main(){
    133     while(scanf("%d",&n)!=EOF){
    134         if(n==0) break;
    135         sumweight=0;
    136         scanf("%d",&m);
    137         if(m==0) {
    138             printf("0\n");
    139             continue;
    140         }
    141         int u,v,w;
    142         for(int i=0;i<m;i++){
    143             scanf("%d%d%d",&u,&v,&w);
    144             //if(edges[i].w<min){
    145               //  edges[i].u=u; edges[i].v=v;edges[i].w=w;
    146             //}
    147             edges[i].u=u; edges[i].v=v; edges[i].w=w;
    148             //edges[i].u=v; edges[i].v=u; edges[i].w=w;
    149         }
    150        // printf("\n");
    151         qsort(edges,m,sizeof(edges[0]),cmp);
    152         Kruskal();
    153         printf("%d\n",sumweight);
    154         sumweight=0;
    155     }
    156     return 0;
    157 }
  • 相关阅读:
    摊还分析
    web端手机方向传感器闲谈
    研一一年论文总结(下)
    Jupyter自定义设置详解
    HAProxy实现动静分离和负载均衡
    欧拉项目 323题
    mysql基本操作
    以后的IT路还很长(1)
    【翻译】在Ext JS集成第三方库
    吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring IoC容器BeanFactory和ApplicationContext
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/2981166.html
Copyright © 2011-2022 走看看