POJ 1258 Agri-Net(最小生成树Prim算法)

来源:互联网 发布:js prompt多个输入 编辑:程序博客网 时间:2024/05/16 17:01
////  main.cpp//  Richard////  Created by 邵金杰 on 16/8/17.//  Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<algorithm>#include<cstring>using namespace std;struct edge{    int v,w;    edge(int v,int w): v(v),w(w) {}    bool operator < (const edge p) const    {        return w>p.w;    }};const int INF=100000000;int vis[110],dist[110];vector<vector<edge> > G(110);int HeapPrime(int n){    memset(vis,0,sizeof(vis));    priority_queue<edge> pq;    for(int i=0;i<n;i++)        dist[i]=INF;    pq.push(edge(0,0));    int nCount=0;    int mindist=0;    while(nCount<n&&!pq.empty())    {        edge nd(0,0);        do{            nd=pq.top();pq.pop();        }while(vis[nd.v]==1&&!pq.empty());        if(vis[nd.v]==0)        {            vis[nd.v]=1;            nCount++;            mindist+=nd.w;            for(int i=0;i<G[nd.v].size();i++)            {                int v=G[nd.v][i].v;                if(vis[v]==0)                {                    int w=G[nd.v][i].w;                    if(dist[v]>w){                        dist[v]=w;                        pq.push(edge(v,w));                    }                }            }        }    }    if(nCount<n) return -1;    return mindist;}int main(){    int n,w;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)            G[i].clear();        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                scanf("%d",&w);                G[i].push_back(edge(j,w));            }        }        printf("%d\n",HeapPrime(n));    }    return 0;}

0 0
原创粉丝点击