Prim。
#include <stdio.h>
#include <string.h>
#define min(a,b) a < b ? a : b
const int maxn = 102;
const int maxe = maxn*maxn;
struct Vertex
{
int head;
}V[maxn];
struct Edge
{
int v,w,next;
}E[maxe];
int n,m,top,d[maxn];
void Init()
{
memset(d,127,sizeof(d));
memset(V,0,sizeof(V));
top = 1;
}
void Add_Edge(int u,int v,int w)
{
E[top].v = v;
E[top].w = w;
E[top].next = V[u].head;
V[u].head = top++;
}
int Prim()
{
if(n == 1)
return 0;
int ans = 0, p = 1,t = n;
d[1] = d[0]+1;
do
{
for(int i=V[p].head;i!=NULL;i=E[i].next)
{
int q = E[i].v;
if(d[q] <= d[0])
d[q] = min(d[q],E[i].w);
}
int mmin = d[0];
for(int i=2;i<=n;i++)
if(d[i] < mmin)
mmin = d[i],p = i;
if(mmin == d[0])
return -1;
d[p] = d[0]+1;
ans += mmin;
}while(--t > 1);
return ans;
}
int main()
{
int u,v,w;
while(scanf("%d",&n),n)
{
Init();
m = n*(n-1)/2;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
Add_Edge(u,v,w);
Add_Edge(v,u,w);
}
printf("%d\n",Prim());
}
return 0;
}
Prim 优先队列。
#include <queue>
#include <stdio.h>
#include <string.h>
using namespace std;
#define min(a,b) a < b ? a : b
const int maxn = 102;
const int maxe = maxn*maxn;
struct Vertex
{
int head;
}V[maxn];
struct Edge
{
int v,w,next;
}E[maxe];
struct Node
{
Node(int u,int w):u(u),w(w){}
int u,w;
bool operator < (const Node& S)const
{
return w > S.w;
}
};
int n,m,top,d[maxn];
bool in[maxn];
void Init()
{
memset(in,false,sizeof(in));
memset(d,127,sizeof(d));
memset(V,-1,sizeof(V));
top = 0;
}
void Add_Edge(int u,int v,int w)
{
E[top].v = v;
E[top].w = w;
E[top].next = V[u].head;
V[u].head = top++;
}
int Prim()
{
int ans = 0;
priority_queue<Node> Q;
d[1] = 0;
Q.push(Node(1,0));
while(!Q.empty())
{
Node R = Q.top();Q.pop();
int p = R.u;
if(in[p])
continue;
in[p] = true;
ans += R.w;
for(int i=V[p].head;i!=-1;i=E[i].next)
{
int q = E[i].v;
if(!in[q] && E[i].w < d[q])
{
d[q] = E[i].w;
Q.push(Node(q,E[i].w));
}
}
}
return ans;
}
int main()
{
int u,v,w;
while(scanf("%d",&n),n)
{
Init();
m = n*(n-1)/2;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
Add_Edge(u,v,w);
Add_Edge(v,u,w);
}
printf("%d\n",Prim());
}
return 0;
}
Kruscal。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define min(a,b) a < b ? a : b
const int maxn = 102;
const int maxe = maxn*maxn/2;
struct Edge
{
int u,v,w;
bool operator < (const Edge& S)const
{
return w < S.w;
}
}E[maxe];
int n,m,pre[maxn];
void Init()
{
memset(pre,-1,sizeof(pre));
}
int Root(int x)
{
if(pre[x] != -1)
return pre[x] = Root(pre[x]);
else
return x;
}
bool Union(int a,int b)
{
int r1 = Root(a);
int r2 = Root(b);
if(r1 == r2)
return true;
pre[r1] = r2;
return false;
}
int Kruscal()
{
int ans = 0, t = n-1;
for(int i=0;t && i<m;i++)
{
if(Union(E[i].u,E[i].v))
continue;
ans += E[i].w;
--t;
}
return t ? -1 : ans;
}
int main()
{
int u,v,w;
while(scanf("%d",&n),n)
{
Init();
m = n*(n-1)/2;
for(int i=0;i<m;i++)
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
sort(E,E+m);
printf("%d\n",Kruscal());
}
return 0;
}