zoukankan      html  css  js  c++  java
  • poj 2485 (kruskal算法)

    /*kruskal算法*/
    #include <iostream>
    //#include <fstream>
    #include <algorithm>
    using namespace std;
    /*708K	922MS*/
    typedef struct _edge
    {
            int x,y;
            int w;
    }edge;
    
    int n;
    int num;
    //fstream fin;
    
    void kruskal(edge *e,int len);
    int cmp(const void *a,const void *b);
    
    int main()
    {
        //fin.open("2485.txt",ios::in);
        int t;
        cin>>t;
        while(t--)
        {
                  cin>>n;
                  edge *e=new edge[n*n];
                  int temp;
                  int len=0;
                  for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)
                    {
                          cin>>temp;
                          if(temp)
                          {
                               e[len].x=i;
                               e[len].y=j;
                               e[len++].w=temp;   
                          }  
                    }
                  kruskal(e,len);
                  cout<<num<<endl;
                  delete []e;
        }
        system("pause");
        return 0;
    }
    
    int cmp(const void *a,const void * b)
    {
        edge *a1=(edge *)a;
        edge *b1=(edge *)b;
        return a1->w-b1->w;
    }
    
    void kruskal(edge *e,int len)
    {
         qsort(e,len,sizeof(edge),cmp);
         int *s=new int[n];
         memset(s,0,sizeof(int)*n);
         int parts=0;
         int max,u,v;
         
         for(int i=0;i<len;i++)
         {
                 u=e[i].x; v=e[i].y;
                 if(!s[u]&&!s[v])
                 {
                      parts++;
                      s[u]=parts;
                      s[v]=parts;
                      max=e[i].w;
                 }
                 else if(s[u]&&!s[v])
                 {
                      s[v]=s[u];
                      max=e[i].w;
                 }
                 else if(s[v]&&!s[u])
                 {
                      s[u]=s[v];
                      max=e[i].w;
                 }
                 else
                 {
                     if(s[v]!=s[u])
                     {
                          int temp1=s[u];
                          int temp2=s[v];
                          if(temp1>temp2)
                          {
                               temp1=s[v];
                               temp2=s[u];
                          }
                          //更新
                          for(int j=0;j<n;j++)
                          {
                                  if(s[j]==temp2)
                                      s[j]=temp1;
                                  else if(s[j]>temp2)
                                      s[j]--;
                          } 
                          max=e[i].w;
                     }
                 }
         }
         
         num=max;
    }
    

    这时间 估计倒数了!

  • 相关阅读:
    HDU 4334
    HDU 1280
    HDU 1060
    HDU 4033
    大三角形分成4个面积相等的小三角形
    HDU 1087
    HDU 4313
    Sleep(0)及其使用场景
    Decorator(装饰、油漆工)对象结构型模式
    Debug Assertion Failed!
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3174494.html
Copyright © 2011-2022 走看看