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;
}

这时间 估计倒数了!

你可能感兴趣的:(poj)