POJ 2377 Bad Cowtractors 最小生成树

POJ 2377 Bad Cowtractors 最小生成树

思路:
典型的最小生成树,Prim搞定。但是速度好慢,用堆应该好一点。

#include  < stdio.h >

int  N, M;

struct  node  {
    
int idx, w;
    
struct node *next;
}
;
struct  node edges[ 40032 ],  * map[ 1024 ],  * exists[ 1024 ][ 1024 ];
int  edges_cnt;
char  visited[ 1024 ];

__inline 
void  add( int  a,  int  b,  int  w)
{
    
struct node *p;

    
if (exists[a][b]) {
        
if (exists[a][b]->< w)
            exists[a][b]
->= w;
        
return ;
    }

    p 
= &edges[edges_cnt++];
    p
->idx = b;
    p
->= w;
    p
->next = map[a];
    map[a] 
= p;
    exists[a][b] 
= p;
}



int  main()
{
    
int i, j, k, max_val, max_idx, sum;
    
struct node *p;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d"&N, &M);
    
while (M--{
        scanf(
"%d%d%d"&i, &j, &k);
        add(i, j, k);
        add(j, i, k);
    }

    visited[
1= 1;
    sum 
= 0;
    
for (k = 0; k < N - 1; k++{
        max_val 
= -1;
        
for (i = 1; i <= N; i++{
            
if (!visited[i])
                
continue;
            
for (p = map[i]; p; p = p->next)
                
if (!visited[p->idx] && p->> max_val) {
                    max_val 
= p->w;
                    max_idx 
= p->idx;
                }

        }

        
if (max_val == -1)
            
break;
        sum 
+= max_val;
        visited[max_idx] 
= 1;
    }


    printf(
"%d\n", k == N - 1 ? sum : -1);

    
return 0;
}

你可能感兴趣的:(POJ 2377 Bad Cowtractors 最小生成树)