Jungle Roads POJ 1251(克鲁斯卡尔算法+并查集)

输入:第一行n代表岛屿的个数,
接下来n行,用大写字母表示,接着是一个整数m,表示与该岛屿连接的字典序大于该岛屿编号的个数,然后该行输入m对数据,每对数据的第一个字母表示与该岛屿连通的岛屿的编号,第二个数字表示要重修两岛屿之间桥所需要的时间,输出数据见样例及原题。
边  与它相连的边的个数 m  m个与他相连的边 重修两岛屿之间桥所需要的时间
该题图为稀疏图,用Kruskal算法比较好

#include <iostream>
#include <cstdio>
#include <cstring> 
#include <cmath>
#include<algorithm>
using namespace std;
 
int fa[500];

struct Edge{
	int x,y,val;
}edge[500];

int find(int x)                
{
    if(fa[x]==x)  return x;
    return fa[x]=find(fa[x]);                  
}
 
bool same(int x,int y){
   return find(x)==find(y) ;
}
 
void bind(int x,int y)
{
    int fx=find(x);
    int fy=find(y);                      
    if(fx!=fy)           
	fa[fx]=fy;
}
 
bool cmp(Edge a,Edge b){
	return a.val<b.val; 
} 

int main()
{
	int n,m,ans,k;
	char E0,Ex;
    while(scanf("%d",&n)!=EOF&&n!=0) {
    	k=0;
		ans=0;
    	for(int i=0;i<=n;i++)//改了 
        fa[i]=i;
        
    	for(int j=0;j<n-1;j++)  {
    		 cin>>E0>>m;
    		//输入及字母处理 
    		while(m--){
    			edge[k].x=int(E0-64);
    			cin>>Ex;
    			edge[k].y=int(Ex-64);
    			cin>>edge[k].val;
                k++; //k记录共有多少个有关系的边 
    		}//将输入的与它关联的点,变成所有与关联的点的集合 
    		//并将字母变成数字 
    	}
    
        sort(edge,edge+k,cmp);//
	
	    for(int i=0;i<k;i++)
	    if(!same(edge[i].x,edge[i].y)){
		   bind(edge[i].x,edge[i].y);
	       ans+=edge[i].val;
	   }
        cout<<ans<<endl;
    }
    return 0;
}

很尴尬我的一个代码 在程序最后注释了,结果错了,删了就好了

 

c-64  A相当于1  所以代码还是1~n 这个就是为什么我的程序初始化的时候即使是从0开始也要最后等于n

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值