USACO 3.1.1 网络布线

来源:互联网 发布:越狱录屏软件 编辑:程序博客网 时间:2024/05/16 07:06

USACO 3.1.1 网络布线
2017年7月14日
最小生成树
- Kruskal
- Prim


  • Kruskal
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int N;#define maxx 100*100+100struct Edges{    int x, y, v;}E[maxx];int ans = 0;int minpay = 0;//最小花费int FatherRoot[120];//并查集void Getinto(int ai, int bi, int ci){    E[++ans].x = ai;    E[ans].y = bi;    E[ans].v = ci;}bool cmp(Edges a, Edges b){return a.v < b.v;}void Putin(){    cin >> N;   int t;    for(int i = 1; i <= N; i++)        for(int k = 1; k <= N; k++){            cin >> t;            if(i != k && i < k)                Getinto(i, k, t);        }    sort(E + 1, E + ans + 1, cmp);    for(int i = 1; i <= N; i++)        FatherRoot[i] = i;    return;}inline int GetFatherRoot(int a){    if(FatherRoot[a] == a)  return a;    int b = GetFatherRoot(FatherRoot[a]);    FatherRoot[a] = b;    return b;}inline void UnionVertex(int a, int b){    int fx = GetFatherRoot(a);    int fy = GetFatherRoot(b);    FatherRoot[fx] = fy;}void Kruskal(){    for(int i = 1; i <= ans; i++)    {        int h1 = GetFatherRoot(E[i].x);        int h2 = GetFatherRoot(E[i].y);        if(h1 == h2)    continue;        minpay += E[i].v;        UnionVertex(E[i].x, E[i].y);    }}int main(){    Putin();    Kruskal();    cout << minpay << endl;    return 0;}
  • Prim
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int N;int V[120][120];int MinDis[120];bool Jud[120];int Length = 0;void Putin(){    cin >> N;    memset(V, 10, sizeof(V));    for(int i = 1; i <= N; i++)        for(int k = 1; k <= N; k++)            cin >> V[i][k];    memset(Jud, false, sizeof(Jud));    for(int i = 1; i <= N; i++)        MinDis[i] = V[1][i];    Jud[1] = true;}void MST_PRIM(){    for(int i = 1; i <= N - 1; i++)    {        int minn = V[0][0];     int sgn = -1;        for(int k = 1; k <= N; k++)            if(MinDis[k] < minn && !Jud[k]){                minn = MinDis[k];                sgn = k;            }        Jud[sgn] = true;        Length += minn;        for(int k = 1; k <= N; k++)            if(!Jud[k] && MinDis[k] > V[sgn][k])                MinDis[k] = V[sgn][k];    }}int main(){    Putin();    MST_PRIM();    cout << Length << endl;    return 0;}
原创粉丝点击