HDU3371

PRIM


#include <iostream>

#include <string.h>
#include <stdio.h>


#define maxn 10000 + 10
#define INF 10000000


using namespace std;


int n,t,m,k,cost,a,b,num;
int rest[maxn];
int vis[maxn];
int dis[maxn];
int graph[maxn][maxn];


void prim(int n)
{
    int i,j,sum = 0,pos  = 0;
    memset(vis,0,sizeof(vis));
    memset(dis,INF,sizeof(dis));


    for(i = 2; i<= n; i++)
       dis[i] = graph[1][i];

   

    vis[1] = 1;

    dis[1] = INF;

  for(  i = 2; i<=n; i++)
     {
         int min = INF;
         for(  j = 1; j<= n; j++)
           if(vis[j] == 0&& dis[j] < min)
             {
                 min = dis[j];
                 pos = j;
             }


        sum += min;
        vis[pos] = 1;


        if(sum >= INF)
            break;
        for(  j = 1; j<= n; j++)
         if(vis[j] == 0 && dis[j] > graph[pos][j] )
            dis[j] = graph[pos][j];


     }
    if(sum < INF)
     cout<<sum<<endl;
    else
     cout<<"-1"<<endl;
}




int main()
{
    scanf("%d",&t);
    while(t--)
    {


        memset(rest,0,sizeof(rest));


        scanf("%d%d%d",&n, &m, &k);
          for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
                graph[i][j] = graph[j][i] = INF;
            graph[i][i]=0;
        }




        for(int i =1; i<=m ;i++)
         {
              scanf("%d%d%d",&a, &b, &cost);
         
              graph[a][b] = graph[b][a] = min(cost,graph[a][b]);
           
    }
       for( int i = 1; i<= k; i++)
       {
           scanf("%d",&num);
           for( int l = 0; l<num; l++)
                      scanf("%d",&rest[l]);
               
         for( int l = 0; l< num; l++)
            for( int h = l+1; h < num; h++)
                graph[rest[h]][rest[l]] =graph[rest[l]][rest[h]]  = 0;
       }
    prim(n);


    }
    return 0;

}



并查集

#include <cstdio>  
#include <algorithm>  
using namespace std;  
  
struct node  
{  
    int x,y,val;  
}w[25002*3];  
int father[505];  
  
bool cmp(const node &a,const node &b)  
{  
    return a.val<b.val;  
}  
  
int find(int x)  
{  
    while(x!=father[x])  
        x=father[x];  
    return x;  
}  
  
int fun(int n,int m)  
{  
    int ans,a,b;  
    ans=0;  
    for (int i=1;i<=m;i++)  
    {  
        a=find(w[i].x);  
        b=find(w[i].y);  
        if(a!=b)  
        {  
            father[a]=b;  
            ans+=w[i].val;  
        }  
    }  
    return ans;  
}  
  
int main()  
{  
    int n,m,k,p,q,t,test,cnt;  
    scanf("%d",&test);  
    while(test--)  
    {  
        scanf("%d %d %d",&n,&m,&k);  
        for(int i=1;i<=n;i++)  
            father[i]=i;  
        for(int i=1;i<=m;i++)  
        {  
            scanf("%d %d %d",&w[i].x,&w[i].y,&w[i].val);  
        }  
        for(int i=0;i<k;i++)  
        {  
            scanf("%d %d",&t,&p);  
            for (int j=1;j<t;j++)  
            {  
                scanf("%d",&q);  
                father[find(q)]=father[find(p)];  
            }  
        }  
        sort(w+1,w+m+1,cmp);  
        if(n==1)  
        {  
            printf("0\n");  
            continue;  
        }  
        t=fun(n,m);  
        cnt=0;  
        for(int i=1;i<=n;i++)  
            if(father[i]==i)  
                cnt++;  
        if(cnt==1)  
            printf("%d\n",t);  
        else  
            printf("-1\n");  
    }  
    return 0;  
}  

你可能感兴趣的:(HDU3371)