NYOJ 434 && poj 1251 最小生成树 Kruskal
2017-04-29 16:27
302 查看
题目大意在相通n个岛屿的所有桥都坏了,要重修,重修每一个桥所用的时间不同,求重修使每个岛屿都间接或直接与其他岛屿相同时所用的的最短时间 (只有修完一个桥后才可修下一个桥)。简言之就是求最小生成树。
对于数据,数据输入的第一行n代表岛屿的个数,当为0是结束程序,接着n-1行开始时为这岛屿的编号,用大写字母表示,接着是一个整数m, 表示与该岛屿连接的字典序大于该岛屿编号的个数,然后该行输入m对数据,每对数据的第一个字母表示与该岛屿连通的岛屿的编号, 第二个数字表示要重修两岛屿之间桥所需要的时间,输出数据见样例及原题。
该题图为稀疏图,用Kruskal算法比较好 这题只是纯粹的求最小生成树,难度不大样例输入
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0样例输出
216 30
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> using namespace std; //最小生成树 //克鲁斯卡尔算法 const int maxn=3333;//最多27个村庄 struct node { int u; int v; int w;//u到v权值为w } num[3333]; //不知道公有多少边 int Father[maxn];//并查集数组 int N;//村庄数目 void init() { for(int i=1; i<=N; i++) Father[i]=i; } int Query(int x) { if(x!=Father[x]) Father[x]=Query(Father[x]); return Father[x]; } int Merge(int x,int y) { int flag_x=Query(x); int flag_y=Query(y); if(flag_x!=flag_y) { Father[flag_x]=flag_y; return 1; } return 0; } bool cmp(node x,node y) { return x.w<y.w; } int main() { while(~scanf("%d",&N)&&N) { int len=0;//边的数量 for(int i=0;i<N-1;i++)//接收数据 { char str1[2]; int num_1; scanf("%s%d",str1,&num_1); for(int i=0;i<num_1;i++) { char str2[2]; int num_2; scanf("%s%d",str2,&num_2); num[len].u=(int)(str1[0]-'A'+1); num[len].v=(int)(str2[0]-'A'+1); num[len++].w=num_2; } } sort(num,num+len,cmp); init(); int min_dis=0;//最小权值 int count=0;//生成树的边 for(int i=0;i<len;i++) { if(Merge(num[i].u,num[i].v)) { count++; min_dis+=num[i].w; } if(count==N-1) { printf("%d\n",min_dis); break; } } } return 0; }
相关文章推荐
- NYOJ 434 && POJ 1251 Jungle Roads(最小生成树)
- POJ 1251 Exponentiation(kruskal 最小生成树)
- hdu 1301&& ny 434 &&poj 1251 Jungle Roads【最小生成树】
- POJ 1251 Jungle Roads (最小生成树 Kruskal克鲁斯卡尔算法)
- POJ 2235 Frogger 最小生成树 Kruskal && Prim
- POJ 1251 Jungle Roads(最小生成树kruskal)
- POJ 1861:Network(最小生成树&&kruskal)
- poj 1251 Jungle Roads (最小生成树--kruskal)
- poj 最小生成树入门水题 1251 && 1258 && 1287 && 2395 && 2485 && 2377
- hdu1301&poj1251 Jungle Roads(最小生成树之prim果题)
- poj&nbsp;1251&nbsp;Jungle&nbsp;Roads&nbsp;最小生成树
- POJ 1258 Agri-Net 最小生成树 prim && kruskal
- POJ 2485 Highways 最小生成树 Kruskal && Prim
- hdu 1301&&poj 1251 最小生成树prim实现
- POJ 1789 Truck History 最小生成树 kruskal && Prim
- POJ 1789 Truck History 【最小生成树&&Kruskal】
- POJ 1258--Agri-Net【最小生成树 && Kruskal && 水题】
- POJ 1251-Jungle Roads 最小生成树Kruskal
- POJ 1251 && HDU 1301 Jungle Roads (最小生成树)
- POJ 2421--Constructing Roads【水题 && 最小生成树 && kruskal】