zoukankan      html  css  js  c++  java
  • UVa 6437 Power Plant( 最小生成树prim )

    题意:

      有多个供电站和村庄,问最少需要多少花费可以使所有村庄通上电。

    题解:

      刚开始不知道该怎么做,后来想了想,直接把供电站先加入到最小生成树里,(供电站之间的边权值为0)。很简单,裸题。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=205,INF=0x3f3f3f3f;
    int cost[maxn][maxn];
    int mincost[maxn];
    bool used[maxn];
    int n,m,k;
    int a[maxn];
    int prim()
    {
        for(int i=1;i<=n;i++)
        {
            mincost[i]=INF;
            used[i]=false;
        }
        mincost[1]=0;
        int res=0;
        while(1)
        {
            int v=-1;
            for(int u=1;u<=n;u++)
            {
                if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
                    v=u;
            }
            if(v==-1)
                break;
            used[v]=true;
            res+=mincost[v];
            for(int u=1;u<=n;u++)
                mincost[u]=min(mincost[u],cost[u][v]);
        }
        return res;
    }
    int main()
    {
        int t,cas=0;
        cin>>t;
        while(t--)
        {
            cin>>n>>m>>k;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    cost[i][j]=INF;
            for(int i=0;i<k;i++)
                cin>>a[i];
            for(int i=0;i<m;i++)
            {
                int a,b,c;
                cin>>a>>b>>c;
                cost[a][b]=cost[b][a]=c;
            } 
            for(int i=0;i<k;i++)
                for(int j=i+1;j<k;j++)
                {
                    cost[a[i]][a[j]]=cost[a[j]][a[i]]=0;
                }
            printf("Case #%d: %d
    ",++cas,prim());
        }
        return 0;
    }
  • 相关阅读:
    NSThread 多线程 三种方式
    CABasicAnimation 核心动画
    图片圆角属性
    GCD
    IOS 推送
    IOS 截图
    UIImage 截图
    UIImageView 动画
    AFN 判断网络状态
    Template 模式
  • 原文地址:https://www.cnblogs.com/orion7/p/7405402.html
Copyright © 2011-2022 走看看