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

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

#include 
#include 
#include  
#include 
#include
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>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

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

 

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

 

你可能感兴趣的:(#,算法之并查集,#,算法之克鲁斯卡尔)