51NOD 1212 最小生成树模板

来源:互联网 发布:书生软件安卓 编辑:程序博客网 时间:2024/06/02 10:12
1212 无向图最小生成树

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 141 2 42 3 83 4 74 5 95 6 106 7 27 8 18 9 72 8 113 9 27 9 63 6 44 6 141 8 8
Output示例
37模板题Prim邻接表
#include <iostream>//邻接表#include <cstring>#include <vector>#define inf 0x3f3f3f3fusing namespace std;int n,m;struct node{    int to,num;};vector<node> v[1010];int prim(){    node d;    bool visit[1010];    int len[1010];    int sum=0;    memset(visit,false,sizeof(visit));    memset(len,inf,sizeof(len));    visit[1]=true;    for(int i=0;i<v[1].size();i++){        d=v[1][i];        //cout<<d.to<<" = "<<d.num<<endl;        len[d.to]=d.num;    }    for(int j=1;j<n;j++){        int nn=-1;        for(int i=1;i<=n;i++){            //cout<<len[i]<<" ";            if(!visit[i]&&(nn==-1||len[i]<len[nn])){                nn=i;            }        }        //cout<<endl;        if(nn==-1){            return -1;        }        sum+=len[nn];        visit[nn]=true;        for(int i=0;i<v[nn].size();i++){            d=v[nn][i];            if(!visit[d.to]&&len[d.to]>d.num){                len[d.to]=d.num;            }        }    }    return sum;}int main(){    cin.sync_with_stdio(false);    int a,b,c;    while(cin>>n>>m){        for(int i=1;i<=n;i++){            v[i].clear();        }        for(int i=0;i<m;i++){            cin>>a>>b>>c;            node d;            d.to=b;            d.num=c;            v[a].push_back(d);            d.to=a;            v[b].push_back(d);        }        cout<<prim()<<endl;    }    return 0;}

 

Prim
邻接矩阵

#include <iostream>//邻接矩阵#include <cstring>#define inf 0x3f3f3f3fusing namespace std;int n,m;int mapp[1010][1010];int prim(){    bool visit[1010];    int len[1010];    int sum=0;    memset(visit,false,sizeof(visit));    visit[1]=true;    for(int i=1;i<=n;i++){        len[i]=mapp[1][i];    }    for(int j=1;j<n;j++){        int nn=-1;        for(int i=1;i<=n;i++){            if(!visit[i]&&(nn==-1||len[i]<len[nn])){                nn=i;            }        }        //cout<<endl;        if(nn==-1){            return -1;        }        sum+=len[nn];        visit[nn]=true;        for(int i=1;i<=n;i++){            if(!visit[i]&&len[i]>mapp[nn][i]){                len[i]=mapp[nn][i];            }        }    }    return sum;}int main(){    cin.sync_with_stdio(false);    int a,b,c;    while(cin>>n>>m){        memset(mapp,inf,sizeof(mapp));        for(int i=0;i<m;i++){            cin>>a>>b>>c;            mapp[a][b]=c;            mapp[b][a]=c;        }        cout<<prim()<<endl;    }    return 0;}

 Prim

链式前向星

#include <iostream>//链式前向星#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 1010#define M 50010#define LL __int64#define inf 0x3f3f3f3f3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1000000007;int n, m;struct node {int to, num, next;}edge[M * 2];int head[N];int cnt;void add(int a, int b, int c) {edge[cnt].to = b;edge[cnt].num = c;edge[cnt].next=head[a];head[a] = cnt++;}int prim() {node d;bool visit[1010];int len[1010];int sum = 0;memset(visit, false, sizeof(visit));memset(len, inf, sizeof(len));visit[1] = true;for (int u = head[1]; u != -1; u = edge[u].next) {len[edge[u].to] = edge[u].num;}for (int j = 1; j<n; j++) {int nn = -1;for (int i = 1; i <= n; i++) {if (!visit[i] && (nn == -1 || len[i]<len[nn])) {nn = i;}}if (nn == -1) {return -1;}sum += len[nn];visit[nn] = true;for (int u = head[nn]; u != -1; u = edge[u].next) {if (!visit[edge[u].to] && len[edge[u].to] > edge[u].num) {len[edge[u].to] = edge[u].num;}}}return sum;}int main() {cin.sync_with_stdio(false);int a, b, c;while (cin >> n >> m) {cnt = 0;memset(head, -1, sizeof(head));for (int i = 0; i<m; i++) {cin >> a >> b >> c;add(a, b, c);add(b, a, c);}cout << prim() << endl;}return 0;}

原创粉丝点击