kuangbin专题六 POJ1251 Jungle Roads(最小生成树)

题意:
一个图,给你N个结点,输入N-1行信息,用大写字母表示节点,节点与节点之间有权值。要你输出最小生成树的值。
题解:
把子母转换成数字就好了,直接上板子。

//后来再次写的prim
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int MAXN=30;
int map[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int n,m;
void prim()
{
    int sum=0;
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=26;i++)
    dis[i]=map[1][i];
    vis[1]=true;
    for(int i=1;i<n;i++)//把这里改成n就不用在下面判断k==0就continue了。
    {
        int MIN=INF,k=0;
        for(int j=1;j<=n;j++)
        if(dis[j]<MIN&&!vis[j])
        MIN=dis[j],k=j;
        sum+=MIN;
        vis[k]=true;
        for(int j=1;j<=n;j++)
        if(!vis[j]&&map[k][j]<dis[j])
        dis[j]=map[k][j];
    }
    printf("%d\n",sum);
}
int main()
{
    while(cin>>n,n)
    {
        memset(map,INF,sizeof(map));
        for(int i=0;i<=26;i++)
        map[i][i]=0;
        for(int i=0;i<n-1;i++)
        {
            char s1,s2;
            cin>>s1>>m;
            int a=s1-64;
            for(int j=0;j<m;j++)
            {
                int w;
                cin>>s2>>w;
                int b=s2-64;
                if(w<map[a][b])
                map[a][b]=map[b][a]=w;
            }
        }
        prim();
    }
    return 0;
}
//之前写的prim
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std; 
const int INF  = 0x3f3f3f;
int map[305][305],lowcost[305],mst[305];
int prim()
{
    int i,j,sum=0;
    for(i=2;i<=26;i++)//i不能等于1,否则会影响下面的程序。因为1已经在集合里了,不能再啦出来算一次 
    {
        lowcost[i]=map[1][i];
        mst[i]=1;
    }
    mst[1]=0;
    for(i=2;i<=26;i++)
    {
        int min=INF,k=0;
        for(j=1;j<=26;j++)
        {
            if(lowcost[j]!=0&&lowcost[j]<min)
            {
                min=lowcost[j];
                k=j;
            }
        }
        if(k==0)
        continue;
        sum+=min;
        lowcost[k]=0;
//      printf("%d,,,,%d\n",sum,k);
        for(j=1;j<=26;j++)
        {
            if(lowcost[j]!=0&&map[k][j]<lowcost[j])
            {
                lowcost[j]=map[k][j];
                mst[k]=j;
            }
        }
    }
    return sum;
}
int main()
{
    int n,m,i,j,l;
    char a,b;
    while(cin>>n)
    {
        if(n==0)
        break; 
        memset(map,INF,sizeof(map));
        memset(lowcost,0,sizeof(lowcost));
        memset(mst,0,sizeof(mst));
        for(i=1;i<n;i++)
        {
            getchar();
            cin>>a>>m;
            a=a-64;
    //      printf("a=%d\n",a);
            for(j=1;j<=m;j++)
            {
                getchar();
                cin>>b;
                b=b-64;
    //          printf("b=%d\n",b);
                cin>>l;
                if(map[a][b]>l)
                map[a][b]=map[b][a]=l;
            }
        }
        int ans=prim();
        cout<<ans<<endl;
    }
} 
//kruskal板子
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=27*27;
struct node
{
    int u,v,w;
}map[MAXN];
int fa[MAXN];
int n,m,k;
bool cmp(node c,node d)
{
    return c.w<d.w;
}
int find(int p)
{
    return fa[p]==p ? p:fa[p]=find(fa[p]);
}
void kruskal()
{
    int sum=0;
    for(int i=0;i<k;i++)
    {
        int P=find(map[i].u);
        int Q=find(map[i].v);
        if(P!=Q)
        {
            fa[P]=Q;
            sum+=map[i].w;
        }
    }
    printf("%d\n",sum);
}
int main()
{
    while(cin>>n,n)
    {
        k=0;
        char s1,s2;
        int a,b,w;
        for(int i=0;i<=26;i++)
        fa[i]=i;
        for(int i=1;i<n;i++)
        {
            cin>>s1>>m;
            for(int j=1;j<=m;j++)
            {
                cin>>s2>>w;
                a=s1-64;
                b=s2-64;
                map[k].u=a;
                map[k].v=b;
                map[k].w=w;
                k++;
            }
        }
        sort(map,map+k,cmp);
        kruskal();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值