zoukankan      html  css  js  c++  java
  • POJ 1861||ZOJ1542 kruskal求最小生成树(POJ秒杀啊)

    题意:用所给的网线链接所有的路流器,使得最长的单根网线的长度在所有方案中是最小的。

    分析:本质还是求最小生成树。为了输出单根网线的长度在所有方案中是最小的以及输入p对顶点,需要在选择的时候记录下已选则 的网线的下标。

    zoj这题80ms,而uva 前面几次tle。后面人品好点干好1s。啊。秒杀啊。擦。

    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;
     66 #define maxn 1000+10
     67 #define maxm 15000+100
     68 int pa[maxn];
     69 struct node{
     70     int u,v,w;
     71 }edges[maxm];
     72 
     73 int sum=0;
     74 int ans[maxn],k;
     75 int maxedge=-INF;
     76 //初始化
     77 void UFset(){
     78     for(int i=1;i<=n;i++){
     79         pa[i]=-1;
     80     }
     81 }
     82 
     83 //查找
     84 int findset(int x){
     85     int s;
     86     for(s=x;pa[s]>=0;s=pa[s]);
     87     while(s!=x){
     88         int tmp=pa[x];
     89         pa[x]=s;
     90         x=tmp;
     91     }
     92     return s;
     93 }
     94 
     95 //合并
     96 void Union(int R1,int R2){
     97     int r1=findset(R1), r2=findset(R2);
     98     //int count=0;
     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 void Kruskral(){
    111     //初始化
    112     UFset();
    113      sum=0;
    114     k=0;
    115     int u,v;
    116     for(int i=0;i<m;i++){
    117         u=edges[i].u; v=edges[i].v;
    118         if(findset(u)!=findset(v)){
    119             ans[k]=i;k++;
    120             if(edges[i].w>maxedge)  maxedge=edges[i].w;
    121             sum++;
    122             Union(u,v);
    123 
    124         }
    125         if(sum>=n-1) break;
    126     }
    127 }
    128 
    129 int cmp(const void*a,const void*b){
    130     node aa=*(const node*)a;
    131     node bb=*(const node*)b;
    132     if(aa.w>bb.w)  return 1;
    133     else return -1;
    134 }
    135 
    136 int main(){
    137     while(scanf("%d%d",&n,&m)!=EOF){
    138         memset(ans,0,sizeof(ans));
    139         for(int i=0;i<m;i++){
    140             scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
    141         }
    142         qsort(edges,m,sizeof(edges[0]),cmp);
    143         sum=0;maxedge=-INF;
    144         Kruskral();
    145         printf("%d\n",maxedge);
    146         printf("%d\n",sum);
    147         for(int i=0;i<sum;i++){
    148             printf("%d %d\n",edges[ans[i]].u,edges[ans[i]].v);
    149         }
    150 
    151     }
    152     return 0;
    153 }
  • 相关阅读:
    1010考试T1
    P5631 最小mex生成树 分治 并查集
    P4366 [Code+#4]最短路 建图 最短路
    P1654 OSU! 期望概率DP
    7.26集训
    7.25集训
    7.23集训
    7.22集训
    7.21test
    7.12test
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/2980772.html
Copyright © 2011-2022 走看看