• hdu 1102 Constructing Roads


    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1102

    题目分类:prim求MST(最小生成树)

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N=1000;
    const int inf=0x3f3f3f3f;
    int vis[N],lowc[N];
    int cost[N][N];
    int n;
    
    int prim(int n,int st)
    {
        int minc,res=0,i,j,pos;
        memset(vis,0,sizeof(vis));
        vis[st]=1;
        for(i=0;i<n;i++)
            lowc[i]=cost[st][i];
        lowc[st]=inf;
    
        for(i=0;i<n;i++)
        {
            minc=inf;
            for(i=0;i<n;i++)
            {
                minc=inf;
                for(j=0;j<n;j++)
                {
                    if(vis[j]==0&&minc>lowc[j])
                    {
                        minc=lowc[j];
                        pos=j;
                    }
                }
    
            }
            if(inf==minc) return -1;
            res+=minc;
            vis[pos]=1;
            for(j=0;j<n;j++)
            {
                if(vis[j]==0&&lowc[j]>cost[pos][j])
                    lowc[j]=cost[pos][j];
            }
        }
        return res;
    }
    
    int main()
    {
        int a,b,m;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf("%d",&cost[i][j]);
            }
        }
    
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d %d",&a,&b);
            cost[a-1][b-1]=0;
            cost[b-1][a-1]=0;
        }
        int ans=prim(n,n-1);
        printf("%d
    ",ans);
        return 0;
    }
    #include<bits/stdc++.h>
    
    using namespace std;
    const int V=200;
    #define INF 0x3f3f3f3f
    
    int cost[V][V];
    int mincost[V];
    bool used[V];
    int v;
    
    int prim()
    {
        for(int i=0;i<v;i++)
        {
            mincost[i]=INF;
            used[i]=0;
        }
        mincost[0]=0;
        int res=0;
    
        while(1)
        {
            int vv=-1;
            for(int u=0;u<v;u++)
            {
                if(!used[u]&&(vv==-1||mincost[u]<mincost[vv]))
                    vv=u;
            }
    
            if(vv==-1) break;
            used[vv]=1;
            res+=mincost[vv];
            for(int u=0;u<v;u++)
                mincost[u]=min(mincost[u],cost[vv][u]);
        }
        return res;
    }
    
    int main()
    {
        int a,b,m,n;
        while(scanf("%d",&v)!=EOF)
        {
            for(int i=0;i<v;i++)
            {
                for(int j=0;j<v;j++)
                {
                    scanf("%d",&cost[i][j]);
                }
            }
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d %d",&a,&b);
                cost[a-1][b-1]=0;
                cost[b-1][a-1]=0;
            }
            int ans=prim();
            printf("%d
    ",ans);
        }
    
        return 0;
    }
    anytime you feel the pain.hey,refrain.don't carry the world upon your shoulders
  • 相关阅读:
    Codeforces Round #340 (Div. 2)
    搞清楚一下格式化输出
    TYVJ P1091 等差数列 Label:dp
    TYVJ P1098 任务安排 Label:倒推dp 不懂
    TYVJ P1034 尼克的任务 Label:倒推dp
    TYVJ P1045 &&洛谷 1388 最大的算式 Label:dp
    TYVJ P1046 Blast Label:dp
    TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)
    TYVJ P1073 加分二叉树 Label:区间dp
    二叉树遍历入门 Lebal:research
  • 原文地址:https://www.cnblogs.com/gaoss/p/4931973.html
Copyright © 2020-2023  润新知