最小生成树之Prime算法(基于优先队列)

来源:互联网 发布:sql 注入 php 提权 编辑:程序博客网 时间:2024/06/16 06:46
#include <cstdio>#include <queue>#include <cstring>#define MAXN 1010#define mem(a,b) memset(a,b,sizeof(a))using namespace std;/* * Prme算法:贪心,适用于稠密图 * 时间复杂度:O(NlogN+M)*/struct node{    int v,dist;    node(int v,int dist):v(v),dist(dist){}    bool operator<(const node& b)const{        return dist>b.dist;    }};int n, g[MAXN][MAXN],dis[MAXN];bool vis[MAXN];priority_queue<node> q;int Prime(int u){    int ans=0;    mem(vis,false);    while(!q.empty()) q.pop();    for(int i=1;i<=n;++i) if(i!=u){dis[i]=g[u][i]; q.push(node(i,dis[i]));}    vis[u]=true;    dis[u]=0;    int cnt=1;    while(!q.empty()){        node tmp=q.top(); q.pop();        u=tmp.v;        if(vis[u]) continue;        vis[u]=true;        ans+=tmp.dist; cnt++;        if(cnt>=n) break;        for(int i=1;i<=n;++i)            if(!vis[i]&&g[u][i]<dis[i]){                q.push(node(i,g[u][i]));                dis[i]=g[u][i];            }    }    return ans;}int main(){    while(scanf("%d",&n)!=EOF){        for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&g[i][j]);        printf("%d\n",Prime(1));    }    return 0;}

0 0
原创粉丝点击