Prim算法和kruskal算法的实现
/*
prim
171MS 312K
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define SIZE 105
#define inf 0xfffffff
using namespace std;
int N;
int lowcost[SIZE];
int cnt[SIZE][SIZE];
bool vis[SIZE];
int ans;
void prim()
{
for(int i=1; i<=N; i++)
lowcost[i] = inf;
for(int i=1; i<=N; i++)
lowcost[i] = cnt[1][i];
lowcost[1] = 0;
for(int i=1; i<=N; i++)
{
int Min = inf;
int k = 0;
for(int j=1; j<=N; j++)
{
if(!vis[j] && lowcost[j] < Min)
{
Min = lowcost[j];
k = j;
}
}
ans += lowcost[k];
vis[k] = true;
for(int j=1; j<=N; j++)
{
if(lowcost[j] > cnt[k][j] && !vis[j])
lowcost[j] = cnt[k][j];
}
}
}
int main()
{
while(~scanf("%d",&N) && N)
{
ans = 0;
memset(vis,0,sizeof(vis));
int s,e,v,ct;
for(int i=1; i<=N*(N-1)/2; i++)
{
scanf("%d%d%d%d",&s,&e,&v,&ct);
if(ct) v = 0;
cnt[s][e] = cnt[e][s] = v;
}
prim();
printf("%d\n",ans);
}
return 0;
}
/*
kruskal
375MS 336K
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define SIZE 105
using namespace std;
struct node
{
int st,ed,val;
}edge[SIZE*SIZE];
int fat[SIZE];
int N,ans;
bool cmp(node a,node b)
{
return a.val < b.val;
}
int find(int x)
{
if(x != fat[x])
fat[x] = find(fat[x]);
return fat[x];
}
void kruskal()
{
int st,ed,val;
for(int i=1; i<=N*(N-1)/2; i++)
{
st = edge[i].st;
ed = edge[i].ed;
val = edge[i].val;
st = find(st);
ed = find(ed);
if(st != ed)
{
fat[st] = ed;
ans += val;
}
}
}
int main()
{
while(~scanf("%d",&N) && N)
{
int s,e,v,ct;
for(int i=1; i<=N*(N-1)/2; i++)
{
scanf("%d%d%d%d",&s,&e,&v,&ct);
if(ct) v = 0;
edge[i].st = s;
edge[i].ed = e;
edge[i].val = v;
}
for(int i=1; i<=N; i++)
fat[i] = i;
sort(edge+1,edge+1+N*(N-1)/2,cmp);
ans = 0;
kruskal();
printf("%d\n",ans);
}
return 0;
}