zoukankan      html  css  js  c++  java
  • Kuangbin 带你飞 最小生成树题解

    整套题都没什么难度、

    POJ 1251 Jungle Roads

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    struct Edge
    {
        int u,v,w;
        friend bool operator < (const Edge &a,const Edge &b)
        {
            return a.w < b.w;
        }
    }edge[100010];
    int fa[MAXN];
    int M;
    int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    
    void kruskal(int N)
    {
        for (int i = 0 ; i < MAXN ; i++) fa[i] = i;
        sort(edge,edge + M);
        int cnt = 0;
        int ret = 0;
        for (int i = 0 ; i < M ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                fa[fv] = fu;
                cnt++;
                ret += edge[i].w;
            }
            if (cnt >= N - 1) break;
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int N;
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            M = 0;
            for (int i = 0 ; i < N - 1; i++)
            {
                char op[5];
                int tot;
                scanf("%s%d",op,&tot);
                int id = op[0] - 'A';
                while (tot--)
                {
                    int val;
                    char tag[5];
                    scanf("%s%d",tag,&val);
                    edge[M].u = id;
                    edge[M].v = tag[0] - 'A';
                    edge[M].w = val;
                    M++;
                }
            }
            kruskal(N);
        }
        return 0;
    }
    View Code

    POJ 1287 Networking

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 70;
    const int INF = 0x3f3f3f3f;
    int dis[MAXN][MAXN];
    int lowcost[MAXN];
    bool vis[MAXN];
    
    void prim(int N)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i < MAXN ; i++) lowcost[i] = dis[1][i];
        vis[1] = true;
        lowcost[1] = 0;
        int ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    pos = j;
                    mincost = lowcost[j];
                }
            }
            if (pos == -1) break;
            ret += mincost;
            vis[pos] = true;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                    lowcost[j] = dis[pos][j];
            }
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int N,M;
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            scanf("%d",&M);
            memset(dis,0x3f,sizeof(dis));
            for (int i = 0 ; i < M ; i++)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                dis[u][v] = min(dis[u][v],w);
                dis[v][u] = min(dis[v][u],w);
            }
            prim(N);
        }
        return 0;
    }
    View Code

    POJ 2031 Building a Space Station

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 110;
    const double eps = 1e-8;
    struct circle
    {
        double x,y,z;
        double r;
    }src[MAXN];
    struct Edge
    {
        int u,v;
        double w;
        friend bool operator < (const Edge &a,const Edge &b)
        {
            return a.w < b.w;
        }
    }edge[MAXN * MAXN];
    int tot,N;
    int fa[MAXN];
    int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    
    void kruskal(int N)
    {
        double ret = 0;
        int cnt = 0;
        for (int i = 0 ; i < tot ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                ret += edge[i].w;
                fa[fv] = fu;
                cnt++;
            }
            if (cnt >= N - 1) break;
        }
        printf("%.3lf
    ",ret);
    }
    
    int main()
    {
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            for (int i = 1 ; i <= N ; i++)
                scanf("%lf%lf%lf%lf",&src[i].x,&src[i].y,&src[i].z,&src[i].r);
            tot = 0;
            for (int i = 0 ; i <= N ; i++) fa[i] = i;
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = i + 1 ; j <= N ; j++)
                {
                    double dis = sqrt((src[i].x - src[j].x) * (src[i].x - src[j].x) + (src[i].y - src[j].y) * (src[i].y - src[j].y) + (src[i].z - src[j].z) * (src[i].z - src[j].z));
                    if (dis > src[i].r + src[j].r)
                    {
                        edge[tot].u = i;
                        edge[tot].v = j;
                        edge[tot].w = dis - src[i].r - src[j].r;
                        tot++;
                    }
                    else
                    {
                        int fi = Find(i),fj = Find(j);
                        if (fi != fj)
                        {
                            fa[fj] = fi;
                        }
                    }
                }
            }
            sort(edge,edge + tot);
            kruskal(N);
        }
        return 0;
    }
    View Code

    POJ 2421 Constructing Roads

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    const int INF = 0x3f3f3f3f;
    int dis[MAXN][MAXN];
    int lowcost[MAXN];
    bool vis[MAXN];
    
    void prim(int N)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i];
        lowcost[1] = 0;
        vis[1] = true;
        int ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            ret += mincost;
            vis[pos] = true;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                    lowcost[j] = dis[pos][j];
            }
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int N,M;
        while (scanf("%d",&N) != EOF)
        {
            for (int i = 1 ; i <= N ; i++)
                for (int j = 1 ; j <= N ; j++) scanf("%d",&dis[i][j]);
            int Q;
            scanf("%d",&Q);
            while (Q--)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                int tmp = dis[u][v];
                dis[u][v] = dis[v][u] = 0;
            }
            prim(N);
        }
        return 0;
    }
    View Code

    ZOJ 1586 QS Network

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 1010;
    const int MAXM = MAXN * MAXN;
    struct Edge
    {
        int u,v,w;
        friend bool operator < (const Edge &a,const Edge &b)
        {
            return a.w < b.w;
        }
    }edge[MAXM];
    int fa[MAXN],price[MAXN];
    int tot;
    int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    
    void kruskal(int N)
    {
        for (int i = 0 ; i <= N ; i++) fa[i] = i;
        sort(edge,edge + tot);
        int cnt = 0 ,ret = 0;
        for (int i = 0 ; i < tot ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                fa[fv] = fu;
                cnt++;
                ret += edge[i].w;
            }
            if (cnt >= N - 1) break;
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while (T--)
        {
            int N;
            scanf("%d",&N);
            for (int i = 1 ; i <= N ; i++) scanf("%d",&price[i]);
            tot = 0;
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = 1 ; j <= N ; j++)
                {
                    int x;
                    scanf("%d",&x);
                    if (i < j)
                    {
                        edge[tot].u = i;
                        edge[tot].v = j;
                        edge[tot++].w = x + price[i] + price[j];
                    }
                }
            }
            kruskal(N);
        }
        return 0;
    }
    View Code

    POJ 1789 Truck History

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 2010;
    const int INF = 0x3f3f3f3f;
    int dis[MAXN][MAXN];
    char word[MAXN][10];
    int lowcost[MAXN];
    bool vis[MAXN];
    
    void prim(int N)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i];
        vis[1] = true;
        lowcost[1] = 0;
        int ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            vis[pos] = true;
            ret += mincost ;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                    lowcost[j] = dis[pos][j];
            }
        }
        printf("The highest possible quality is 1/%d.
    ",ret);
    }
    
    int cal(int x,int y)
    {
        int cnt = 0;
        for (int i = 0 ; i < 7 ; i++)
            if (word[x][i] != word[y][i]) cnt++;
        return cnt;
    }
    
    int main()
    {
        int N;
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            for (int i = 1 ; i <= N ; i++) scanf("%s",word[i]);
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = i + 1 ; j <= N ; j++)
                {
                    int dist = cal(i,j);
                    dis[i][j] = dist;
                    dis[j][i] = dist;
                }
            }
            prim(N);
        }
        return 0;
    }
    View Code

    POJ 2349 Arctic Network

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 510;
    const int MAXM = MAXN * MAXN;
    int fa[MAXN];
    int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    struct node
    {
        double x,y;
    }src[MAXN];
    struct Edge
    {
        int u,v;
        double w;
        friend bool operator <(const Edge &a,const Edge & b)
        {
            return a.w < b.w;
        }
    }edge[MAXM];
    int S,P;
    vector<double>ans;
    int cas;
    
    void build()
    {
        cas = 0;
        for (int i = 1 ; i <= P ; i++) scanf("%lf%lf",&src[i].x,&src[i].y);
        for (int i = 1 ; i <= P ; i++)
        {
            for (int j = i + 1 ; j <= P ; j++)
            {
                double dis = sqrt((src[j].x - src[i].x) * (src[j].x - src[i].x)
                        + (src[j].y - src[i].y) * (src[j].y - src[i].y));
                edge[cas].u = i;
                edge[cas].v = j;
                edge[cas].w = dis;
                cas++;
                edge[cas].v = i;
                edge[cas].u = j;
                edge[cas].w = dis;
                cas++;
            }
        }
    }
    int cmp(const double &a,const double &b)
    {
        return a > b;
    }
    void kruskal()
    {
        for (int i = 0 ; i <= P ; i++) fa[i] = i;
        double ret = 0;
        int cnt = 0;
        ans.clear();
        sort(edge,edge + cas);
        for (int i = 0 ; i < cas ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                cnt++;
                ret += edge[i].w;
                ans.push_back(edge[i].w);
                fa[fu] = fv;
            }
            if (cnt >= P - 1) break;
        }
        //printf("%lf
    ",ret);
        sort(ans.begin(),ans.end(),cmp);
        if (S >= P) printf("0.00
    ");
        else
        {
            S--;
            printf("%.2f
    ",ans[S]);
        }
        //printf("%.2lf
    ",max(ret,0.0));
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%d",&S,&P);
            build();
            kruskal();
        }
        return 0;
    }
    View Code

    POJ 1751 Highways

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 760;
    int fa[MAXN];
    int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    int x[MAXN],y[MAXN];
    struct Edge
    {
        int u,v,w;
        friend bool operator < (const Edge &a,const Edge &b)
        {
            return a.w < b.w;
        }
    }edge[MAXN * MAXN / 2];
    int N,tot;
    
    void kruskal(int N)
    {
        sort(edge,edge + tot);
        int cnt = 0;
        for (int i = 0 ; i < tot ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                printf("%d %d
    ",edge[i].u,edge[i].v);
                fa[fv] = fu;
                cnt++;
            }
            if (cnt >= N - 1) break;
        }
    }
    
    int main()
    {
    scanf("%d",&N);
        {
            tot = 0;
            for (int i = 1 ; i <= N ; i++)scanf("%d%d",&x[i],&y[i]);
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = i + 1 ; j <= N ; j++)
                {
                    int tmp = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
                    edge[tot].u = i;
                    edge[tot].v = j;
                    edge[tot].w = tmp;
                    tot++;
                }
            }
            for (int i = 1 ; i <= N ; i++) fa[i] = i;
            int M;
            scanf("%d",&M);
            while (M--)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                int fu = Find(u);
                int fv = Find(v);
                if (fu != fv)
                {
                    fa[fv] = fu;
                }
            }
            kruskal(N);
        }
        return 0;
    }
    View Code

    POJ 1258 Agri-Net

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 110;
    const int INF = 0x3f3f3f3f;
    LL lowcost[MAXN];
    LL dis[MAXN][MAXN];
    bool vis[MAXN];
    
    void prim(int N)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i];
        lowcost[1] = 0;
        vis[1] = true;
        LL ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            ret += mincost;
            vis[pos] = true;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                    lowcost[j] = dis[pos][j];
            }
        }
        printf("%lld
    ",ret);
    }
    
    int main()
    {
        int    N;
        while (scanf("%d",&N) != EOF)
        {
            for (int i = 1 ; i <= N ; i++)
                for (int j = 1 ; j <= N ; j++) scanf("%lld",&dis[i][j]);
            prim(N);
        }
        return 0;
    }
    View Code

    POJ 3026 Borg Maze

    这道题我就也无语了。看了Discuss就知道他究竟就多多多多多坑,呵呵

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    const int INF = 0x3f3f3f3f;
    const int MAXD = 210;
    const int dx[] = {0,0,1,-1};
    const int dy[] = {1,-1,0,0};
    char G[MAXN][MAXN];
    queue<pair<int,int> >q;
    int N,M;
    int dis[MAXN][MAXN];
    int dist[MAXD][MAXD];
    bool vis[MAXD][MAXD];
    int id[MAXN][MAXN],tot;
    
    void bfs(int x,int y)
    {
        memset(vis,false,sizeof(vis));
        int idx = id[x][y];
        while (!q.empty()) q.pop();
        dist[x][y] = 0;
        dis[idx][idx] = 0;
        q.push(make_pair(x,y));
        vis[x][y] = true;
        while (!q.empty())
        {
            pair<int,int>u = q.front(); q.pop();
            int fidx = id[u.first][u.second];
            for (int d = 0 ; d < 4 ; d++)
            {
                int nx = u.first + dx[d];
                int ny = u.second + dy[d];
                int nidx = id[nx][ny];
                if (!vis[nx][ny] && nx >= 1 && nx <= N && ny >= 1 && ny <= M && G[nx][ny] == ' ')
                {
                    vis[nx][ny] = true;
                    dist[nx][ny] = dist[u.first][u.second] + 1;
                    q.push(make_pair(nx,ny));
                }
                else if (!vis[nx][ny] && nx >= 1 && nx <= N  && ny >= 1 && ny <= M && isupper(G[nx][ny]))
                {
                    vis[nx][ny] = true;
                    dist[nx][ny] = dist[u.first][u.second] + 1;
                    q.push(make_pair(nx,ny));
                    int nidx = id[nx][ny];
                    dis[idx][nidx] = dist[nx][ny];
                }
            }
        }
    }
    
    int lowcost[MAXN];
    bool used[MAXN];
    
    void prim(int N)
    {
        memset(used,false,sizeof(used));
        for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i];
        lowcost[1] = 0;
        used[1] = true;
        int ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!used[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            ret += mincost;
            used[pos] = true;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!used[j] && lowcost[j] > dis[pos][j])
                    lowcost[j] = dis[pos][j];
            }
        }
        printf("%d
    ",ret);
    }
    
    
    int main()
    {
        int T;
        char tmp[300];
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%d",&M,&N);
            gets(tmp);
            memset(id,-1,sizeof(id));
            int cas = 0;
            for (int i = 1 ; i <= N ; i++)gets(G[i] + 1);
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = 1 ; j <= M ; j++)
                    if (G[i][j] == 'A' || G[i][j] == 'S')
                        id[i][j] = ++cas;
            }
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = 1 ; j <= M ; j++)
                    if (isupper(G[i][j]))
                        bfs(i,j);
            }
            prim(cas);
        }
        return 0;
    }
    View Code

    POJ 1679 The Unique MST

    求次小生成树

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    const int INF = 0x3f3f3f3f;
    bool vis[MAXN];
    int cost[MAXN][MAXN];
    int lowcost[MAXN];
    int pre[MAXN],MAX[MAXN][MAXN];
    bool used[MAXN][MAXN];
    
    int prim(int cost[][MAXN],int n)
    {
        int ret = 0;
        memset(vis,false,sizeof(vis));
        memset(MAX,0,sizeof(MAX));
        memset(used,false,sizeof(used));
        vis[1] = true;
        pre[1] = -1;
        for (int i = 1 ; i <= n ; i++)
        {
            lowcost[i] = cost[1][i];
            pre[i] = 1;
        }
        lowcost[1] = 0;
        pre[1] = -1;
        for (int i = 2 ; i <= n ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= n ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) return -1;
            ret += mincost;
            vis[pos] = true;
            used[pos][pre[pos]] = used[pre[pos]][pos] = true;
            for (int j = 1;  j <= n ; j++)
            {
                if (vis[j]) MAX[j][pos] = MAX[pos][j] = max(MAX[j][pre[pos]],lowcost[pos]);
                if (!vis[j] && lowcost[j] > cost[pos][j])
                {
                    lowcost[j] = cost[pos][j];
                    pre[j] = pos;
                }
            }
        }
        return ret;
    }
    
    int calcusmst(int cost[][MAXN],int n,int ret)
    {
        int MIN = INF;
        for (int i = 1 ; i <= n ; i++)
        {
            for (int j = i + 1 ; j <= n ; j++)
            {
                if (cost[i][j] < INF && !used[i][j])
                    MIN = min(MIN,ret + cost[i][j] - MAX[i][j]);
            }
        }
        if (MIN == INF) return -1;
        return MIN;
    }
    
    int main()
    {
        int T,N,M;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%d",&N,&M);
            for (int i = 0 ; i <= N ; i++)
                for (int j = 0 ; j <= N ; j++) cost[i][j] = i == j ? 0 : INF;
            while (M--)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                cost[u][v] = cost[v][u] = w;
            }
            int ret = prim(cost,N);
            if (ret == -1)
            {
                printf("Not Unique!
    ");
                continue;
            }
            if (ret == calcusmst(cost,N,ret)) printf("Not Unique!
    ");
            else printf("%d
    ",ret);
        }
        return 0;
    }
    View Code

    HDU 1233 还是畅通工程

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 110;
    const int INF = 0x3f3f3f3f;
    int dis[MAXN][MAXN];
    int lowcost[MAXN];
    bool vis[MAXN];
    
    void prim(int N)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i];
        vis[1] = true;
        lowcost[1] = 0;
        int ret = 0;
        for (int i = 1 ; i <= N ; i++)
        {
            int mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            ret += mincost;
            vis[pos] = true;
            for (int j = 1 ; j <= N ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                        lowcost[j] = dis[pos][j];
            }
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int N;
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            for (int i = 1 ; i <= N ; i++)
                for (int j = 1 ; j <= N ; j++) dis[i][j] = i == j ? 0 : INF;
            int tmp = N * (N - 1) / 2;
            for (int i = 0 ; i < tmp ; i++)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                dis[u][v] = dis[v][u] = w;
            }
            prim(N);
        }
        return 0;
    }
    View Code

    HDU 1301 Jungle Roads

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    struct Edge
    {
        int u,v,w;
        friend bool operator < (const Edge &a,const Edge &b)
        {
            return a.w < b.w;
        }
    }edge[100010];
    int fa[MAXN];
    int M;
    int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);}
    
    void kruskal(int N)
    {
        for (int i = 0 ; i < MAXN ; i++) fa[i] = i;
        sort(edge,edge + M);
        int cnt = 0;
        int ret = 0;
        for (int i = 0 ; i < M ; i++)
        {
            int fu = Find(edge[i].u);
            int fv = Find(edge[i].v);
            if (fu != fv)
            {
                fa[fv] = fu;
                cnt++;
                ret += edge[i].w;
            }
            if (cnt >= N - 1) break;
        }
        printf("%d
    ",ret);
    }
    
    int main()
    {
        int N;
        while (scanf("%d",&N) != EOF)
        {
            if (N == 0) break;
            M = 0;
            for (int i = 0 ; i < N - 1; i++)
            {
                char op[5];
                int tot;
                scanf("%s%d",op,&tot);
                int id = op[0] - 'A';
                while (tot--)
                {
                    int val;
                    char tag[5];
                    scanf("%s%d",tag,&val);
                    edge[M].u = id;
                    edge[M].v = tag[0] - 'A';
                    edge[M].w = val;
                    M++;
                }
            }
            kruskal(N);
        }
        return 0;
    }
    View Code

    HDU 1875 畅通工程再续

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    const int MAXN = 210;
    const double INF = 1e14;
    double dis[MAXN][MAXN];
    double lowcost[MAXN];
    bool vis[MAXN];
    double x[MAXN],y[MAXN];
    
    double prim(int n)
    {
        memset(vis,false,sizeof(vis));
        for (int i = 0 ; i <= n ; i++) lowcost[i] = dis[1][i];
        vis[1] = true;
        lowcost[1] = 0;
        double ret = 0;
        for (int i = 1 ; i <= n ; i++)
        {
            double mincost = INF;
            int pos = -1;
            for (int j = 1 ; j <= n ; j++)
            {
                if (!vis[j] && lowcost[j] < mincost)
                {
                    mincost = lowcost[j];
                    pos = j;
                }
            }
            if (pos == -1) break;
            vis[pos] = true;
            ret += mincost;
            for (int j = 1 ; j <= n ; j++)
            {
                if (!vis[j] && lowcost[j] > dis[pos][j])
                        lowcost[j] = dis[pos][j];
            }
        }
        return ret;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while (T--)
        {
            int N;
            scanf("%d",&N);
            for (int i = 1 ; i <= N ; i++)
            {
                scanf("%lf%lf",&x[i],&y[i]);
            }
            for (int i = 1 ; i <= N ; i++)
                for (int j = 1 ; j <= N ; j++) dis[i][j] = i == j ? 0 : INF;
            for (int i = 1 ; i <= N ; i++)
            {
                for (int j = i + 1 ; j <= N ; j++)
                {
                    double dist = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
                   // printf("%lf
    ",dist);
                    if (dist >= 10.0 && dist < 1000)
                    {
                        dis[i][j] = dis[j][i] = dist;
                       // printf("%lf
    ",dist);
                    }
                }
            }
           // for (int i = 1 ; i <= N ; i++)
           //     for (int j = 1 ; j <= N ; j++) printf("%lf%c",dis[i][j],j == N ? '
    ' : ' ');
            double ret = prim(N);
            if (ret >= INF || ret == 0.0) puts("oh!");
            else
            {
                ret *= 100.0;
                printf("%.1lf
    ",ret);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    有向图的十字链表存储表示 以及相关操作(包括增加弧、删除弧、删除顶点等)
    数据结构学习笔记—图---图的连通性、顶点间的路径
    解决Vue父路由进入子路由选中样式消失的问题
    解决vue页面刷新,数据丢失
    解决PHP接收不到axios的POST的传参方式
    rem理解及应用【笔记】
    JS基础(学习笔记)
    css中的小技巧
    css中文单行、多行超出省略号和英文换行(学习笔记)
    关于JS(原生js+jq)中获取、设置或者删除元素属性和获取元素值
  • 原文地址:https://www.cnblogs.com/Commence/p/4907317.html
Copyright © 2011-2022 走看看