题目大意:给出n个节点,再有m条边,这m条边代表从a节点到b节点电缆的长度,现在要你将所有节点都连起来,并且使长度最小
解题思路:求最小生成树众所周知 有两种算法,一种是普利姆算法,一种是克鲁斯卡尔算法 克鲁斯卡尔是与并查集有关的算法 所以可以用两种算法来解决这道题 由于基本是模板题 并没有什么要讲的
克鲁斯卡尔算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 2005
int n,m,sum,total;
int p[N];
struct node
{
int f;
int t;
int v;
}q[N];
int cmp(node a,node b)
{
return a.v<b.v;
}
int find(int x)
{
if(x!=p[x])
{
p[x]=find(p[x]);
}
return p[x];
}
int pri()
{
sum=0;
total=0;
FOR(i,m,1)
{
int f=q[i].f;
int t=q[i].t;
if(find(f)!=find(t))
{
p[find(f)]=find(t);
sum+=q[i].v;
total++;
}
if(total==n-1)
return sum;
}
return 0;
}
int main()
{
while(~dsc(n,m))
{
if(n==0)
break;
FOR(i,n,1)
{
p[i]=i;
}
FOR(i,m,1)
{
scanf("%d %d %d",&q[i].f,&q[i].t,&q[i].v);
}
sort(q+1,q+1+m,cmp);
pr(pri());
}
return 0;
}
普利姆算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 2005
int n,m;
int mp[105][105],dis[N],vis[N];
int pri()
{
int sum=0;
FOR(i,n,1)
{
dis[i]=mp[1][i];
}
vis[1]=1;
FOR(i,n-1,1)
{
int to=-1;
int minn=Inf;
FOR(j,n,1)
{
if(!vis[j]&&dis[j]<minn)
{
to=j;
minn=dis[j];
}
}
if(to==-1)
return 0;
vis[to]=1;
sum+=minn;
FOR(j,n,1)
{
if(!vis[j])
dis[j]=min(dis[j],mp[to][j]);
}
}
return sum;
}
int main()
{
while(~sc(n),n)
{
lcr(vis,0);
FOR(i,n,1)
{
FOR(j,n,1)
mp[i][j]=Inf;
}
sc(m);
FOR(i,m,1)
{
int f,t,v;
scanf("%d %d %d",&f,&t,&v);
mp[f][t]=mp[t][f]=min(v,mp[t][f]);
}
pr(pri());
}
return 0;
}
END!!!!!!!!!!!!!!!!!!