数据结构真的重要!!!所以记入下来,以后留给学弟看!
最小生成树(普里姆算法—Prim算法)+(克鲁斯卡尔算法) 实在是觉得Kruskal算法。。。。
板子的话!等我写Kruskal的时候补上
板子
Prim持续等待更新!!!复杂度 O(n*n)
算法:最小生成树Kruskal 复杂度 O(E)
最小生成树裸题
题目传送门:POJ1251
题意:给定n,接下来n-1行,每一行表示这个树跟其他点相连的距离!!!然根本不需要考虑重边!!!直接裸题!!!
AC代码
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<string>
#include<set>
#define sa(t) scanf("%d",&t)
#define SA(t) scanf("%lld", %t)
#define PF(t) printf("%lld",t)
#define pf(t) printf("%d", t)
#define PFF(t) printf("%lld\n",t)
#define pff(t) printf("%d\n", t)
typedef long long int ll;
void read(int &x)
{
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
using namespace std;
const int maxn = 10004;
int fa[maxn];
int Find(int x){
if(fa[x] == x)
return x;
else
return fa[x] = Find(fa[x]);
}
struct node{
int a,b,val;
}pp[maxn];
bool cmp(node a, node b){
return a.val < b.val;
}
void init(int n){
for(int i = 0; i <= n+1; i++)
fa[i] = i;
}
int main(){
int n;
while(cin>>n,n){
if( n == 0 )
break;
init(n);
char x,y;
int m,mm;
int cnt = 0, ans = 0;
for(int i = 1; i < n; i++){
cin>>x>>m;
for(int j = 1; j <=m;j++){
cin>>y>>mm;
pp[cnt].val =mm;
pp[cnt].a = x-'A';
pp[cnt].b = y - 'A';
cnt++;
}
}
sort(pp,pp+cnt,cmp);
for(int i = 0; i < cnt; i++){
int x = pp[i].a;
int y = pp[i].b;
if(Find(x) != Find(y)){
fa[Find(x)] = Find(y);
ans = ans + pp[i].val;
}
}
pff(ans);
}
return 0;
}
最小生成树第一题
题目传送门:POJ1287
题意: n,m表示的就是n颗树,接下来m条边,然后套…
我的理解: 我感觉我不改做这个数据结构专题的!!!(⊙o⊙)…
这个题目吧!我开始想错了!我看了有重边!本来想去重边!后来我发现了!完全不需要!!还是菜!!继续刷吧!!!
AC代码
//#include<bits/stdc++.h>
#include<iostream