最小生成树模板题目,好久不做了,练练手。
prim算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <iomanip>
#define maxn 30
#define inf 1<<29
using namespace std;
int map[maxn][maxn];
bool visit[maxn];
int dis[maxn];
int n;
void prim()
{
int i,j,x,v;
for(i=0;i<n;i++)
{
dis[i]=map[0][i];
visit[i]=0;
}
for(i=1;i<=n;i++)
{
x=inf;
for(j=0;j<n;j++)
{
if(!visit[j]&&x>dis[j])
{
v=j;
x=dis[j];
}
}
visit[v]=1;
for(j=0;j<n;j++)
{
if(!visit[j]&&dis[j]>map[v][j])
{
dis[j]=map[v][j];
}
}
}
for(i=1;i<n;i++)
{
dis[0]+=dis[i];
}
printf("%d\n",dis[0]);
}
int main()
{
int i,j,m,c;
char a[2],b[2];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
map[i][j]==0;
}
else
{
map[i][j]=inf;
}
}
}
for(i=1;i<n;i++)
{
scanf("%s%d ",&a,&m);
{
for(j=0;j<m;j++)
{
scanf("%s%d ",&b,&c);
map[a[0]-'A'][b[0]-'A']=map[b[0]-'A'][a[0]-'A']=c;
}
}
}
prim();
}
return 0;
}
Kruskal算法,顺手练练邻接表
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <algorithm>
#define maxn 33
using namespace std;
int n,k,father[maxn];
struct node
{
int s;
int next;
int w;
}edge[maxn*maxn];//邻接表
int find(int x)//寻找根节点
{
int r=x;
while(father[r]!=r)
{
r=father[r];
}
return r;
}
bool unoin(int x,int y)//判断是否构成环
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)//不构成环
{
father[fx]=fy;
return 1;
}
return 0;//构成环
}
void kruskal()//算法
{
int ans=0;
for(int i=0;i<k;i++)
{
if(unoin(edge[i].s,edge[i].next))
{
ans+=edge[i].w;
}
}
printf("%d\n",ans);
}
bool cmp(node a,node b)//从小到大排列
{
return a.w<b.w;
}
int main()
{
int m,c;
char a[2],b[2];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
k=0;
for(int i=0;i<=n;i++)
{
father[i]=i;
}
for(int i=1;i<n;i++)
{
scanf("%s%d",&a,&m);
for(int j=0;j<m;j++)
{
scanf("%s%d ",&b,&c);
edge[k].s=a[0]-'A';
edge[k].next=b[0]-'A';
edge[k++].w=c;
}
}
sort(edge,edge+k,cmp);//排序
/*for(int i=0;i<k;i++)
{
cout<<edge[i].w<<" ";
}
cout<<endl;*/
kruskal();
}
return 0;
}