Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39897
  • 博文数量: 22
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-11 17:20
文章分类

全部博文(22)

文章存档

2010年(3)

2009年(19)

我的朋友
最近访客

分类:

2009-11-08 16:18:18

最大生成树

//4088K    79MS

#include <iostream>
#include <stdio.h>
using namespace std;

const int MN=1001;
const int MM=20001;

int Map[MN][MN];
bool visited[MN];
int dist[MN];

int M,N;
int ans=0;
bool wrong=false;

void Prim(int s)
{
    memset(visited,false,sizeof(visited));
    
    visited[s]=true;
    for(int i=1;i<=N;i++)
        dist[i]=Map[s][i];

    int Num=1;
    while(Num<N){
        int tag=-1;
        int Max=INT_MIN;
        for(int i=1;i<=N;i++){
            if(!visited[i]){
                if(dist[i]>Max){
                    Max=dist[i];
                    tag=i;
                }
            }
        }
        if(Max==-1)
        {
            wrong=true;
            return;
        }
        visited[tag]=true;
        ans+=Max;
        Num++;
        for(int i=1;i<=N;i++){
            if(Map[tag][i]>dist[i]&&Map[tag][i]!=-1
               &&(!visited[i])){
                dist[i]=Map[tag][i];
            }
        }
    }
}

            
int main()
{
    scanf("%d%d",&N,&M);
    int x,y,v;
    for(int i=0;i<MN;i++)
        for(int j=0;j<MN;j++)
            Map[i][j]=-1;
    for(int i=1;i<=M;i++){
        scanf("%d%d%d",&x,&y,&v);
        if(v>Map[x][y])
            Map[x][y]=v;
        if(v>Map[y][x])
            Map[y][x]=v;
    }
    int source=x;
    Prim(source);
    if(!wrong)
        printf("%d\n",ans);
    else
        printf("-1\n");
    return 0;
}

    
    


阅读(368) | 评论(0) | 转发(0) |
0

上一篇:POJ 1787

下一篇:POJ 2380

给主人留下些什么吧!~~