输入:第一行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