• POJ1251 || ZOJ1406 kruskal求最小生成树


    题意:求连接所有村庄道路的最小费用。

    分析:kruskal算法,直接求最小生成树。

    注意:这题输入的时候是字母,所以要注意了。POJ如果用getchar()的话会wa。坑爹啊。还好我后来在ZOJ 上提交过了,在POJ discuss里发现说tle||re的注意了要用数组输入字母(呵呵,我的是WA),以后碰到这种还是直接用数组,省那么点空间干嘛。还有这题关键是建图,具体细则参看代码。这次代码有点乱。呵呵。见谅。

    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 1000+10
     67 int pa[maxn];
     68 //dis[maxn][maxn];
     69 char str[maxn][maxn];
     70 int num=0;
     71 int sumweight=0;
     72 int cnt=0;
     73 struct node{
     74     int u,v,w;
     75 }edges[maxn];
     76 
     77 //初始化
     78 void UFset(){
     79     for(int i=0;i<n;i++){
     80         pa[i]=-1;
     81     }
     82 }
     83 
     84 //查找
     85 int findset(int x){
     86     int s;
     87     for(s=x;pa[s]>=0;s=pa[s]);
     88     while(s!=x){
     89         int tmp=pa[x];
     90         pa[x]=s;
     91         x=tmp;
     92     }
     93     return s;
     94 }
     95 
     96 //合并
     97 void Union(int R1,int R2){
     98     int r1=findset(R1),r2=findset(R2);
     99     int tmp=pa[r1]+pa[r2];
    100     if(pa[r1]>pa[r2]){
    101         pa[r1]=r2;
    102         pa[r2]=tmp;
    103     }
    104     else {
    105         pa[r2]=r1;
    106         pa[r1]=tmp;
    107     }
    108 }
    109 
    110 
    111 int cmp(const void*a,const void*b){
    112     node aa=*(const node*)a;
    113     node bb=*(const node*)b;
    114     if(aa.w>bb.w) return 1;
    115     else return -1;
    116 }
    117 void Kruskal(){
    118     int u,v;
    119     UFset();
    120     num=0;
    121     for(int i=0;i<cnt;i++)
    122     {
    123         u=edges[i].u; v=edges[i].v;
    124         if(findset(u)!=findset(v)){
    125             sumweight+=edges[i].w;
    126             num++;
    127             Union(u,v);
    128         }
    129         if(num>=n-1) break;
    130     }
    131 }
    132 
    133 int main(){
    134     while(scanf("%d",&n)!=EOF){
    135         if(n==0)  break;
    136         char ch[100],ch1[100];
    137         int d;
    138         mi=0;
    139         int u,v;
    140         cnt=0;
    141         sumweight=0;
    142         for(int i=0;i<n-1;i++){
    143             //getchar();
    144             scanf("%s",ch);
    145             u=ch[0]-'A';
    146             scanf("%d",&m);
    147             if(m==0) continue;
    148             for(int j=0;j<m;j++){
    149                // getchar();
    150                 scanf("%s %d",ch1,&d);
    151                 v=ch1[0]-'A';
    152                 edges[cnt].u=u;
    153                 edges[cnt].v=v;
    154                 edges[cnt++].w=d;
    155                // printf("edges[i]=%d\n",edges[i].w);
    156                 mi++;
    157             }
    158         }
    159         qsort(edges,cnt,sizeof(edges[0]),cmp);
    160         Kruskal();
    161         printf("%d\n",sumweight);
    162         sumweight=0;
    163     }
    164     return 0;
    165 }
  • 相关阅读:
    2019.8.6原型链与继承
    2019.8.2闭包,作用域
    2019.8.1正则二
    2019.7.31正则
    2019.7.29二维数组
    2019.7.28关于数组和循环的八道题
    2019.7.27数组api
    DOM
    JavaScript数组5种去重方法
    JavaScript面向对象
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/2980979.html
Copyright © 2020-2023  润新知