1.Code:
Prim:
/*
Problem: 1287 User: lantianheyeqi
Memory: 4132K Time: 63MS
Language: C++ Result: Accepted
*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#define N 1005
#define INF 0x7fffffff
using namespace std;
int map[N][N];
int n,m;
int heap[N];
int pos[N];
int heapnum;
int dis[N];
void swap(int x,int y)
{
int t=heap[x];
heap[x]=heap[y];
heap[y]=t;
t=pos[heap[x]];
pos[heap[x]]=pos[heap[y]];
pos[heap[y]]=t;
}
void siftdown(int x)
{
int t;
while(2*x<=heapnum)
{
if(dis[heap[x]]>dis[heap[x*2]]) t=x*2;
else t=x;
if(x*2+1<=heapnum&&dis[heap[x*2+1]]<dis[heap[t]]) t=x*2+1;
if(x!=t)
{
swap(x,t);
x=t;
}
else break;
}
}
void siftup(int i)
{
while(i!=1)
{
if(dis[heap[i]]<dis[heap[i/2]])
{
swap(i,i/2);
i=i/2;
}
else break;
}
}
int pop()
{
int tt=heap[1];
heap[1]=heap[heapnum--];
siftdown(1);
return tt;
}
void init()
{
for(int i=1;i<=n;i++)
{
heap[i]=i;
pos[i]=i;
}
for(int i=heapnum/2;i>=1;i--) siftdown(i);
}
void prim()
{
int book[N];
memset(book,0,sizeof(book));
heapnum=n;
for(int i=1;i<=n;i++) dis[i]=map[1][i];
int sum=0;
book[1]=1;
dis[1]=0;
init();
pop();
for(int i=1;i<=n-1;i++)
{
int minpoint=pop();
book[minpoint]=1;
sum+=dis[minpoint];
for(int j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]>map[minpoint][j])
{
dis[j]=map[minpoint][j];
siftup(pos[heap[j]]);
}
}
}
printf("%d\n",sum);
}
int main()
{
while(scanf("%d%d",&n,&m)&&n!=0)
{
for(int i=1;i<N;i++)
{
for(int j=1;j<N;j++)
{
map[i][j]=INF;
}
}
for(int i=1;i<=m;i++)
{
int dx,dy,dz;
scanf("%d%d%d",&dx,&dy,&dz);
if(dz<map[dx][dy]) map[dx][dy]=map[dy][dx]=dz;
}
prim();
}
return 0;
}
Krustral:
/*
Problem: 1287 User: lantianheyeqi
Memory: 980K Time: 32MS
Language: C++ Result: Accepted
*/
#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
#include"algorithm"
#define N 100000
using namespace std;
typedef struct node
{
int x;
int y;
int weight;
}point;
int n,m;
point edge[N];
int fa[N];
int deep[N];
bool cmp(point a,point b)
{
if(a.weight>b.weight) return false;
else return true;
}
void init()
{
for(int i=1;i<N;i++)
{
fa[i]=i;
deep[i]=1;
}
}
int find(int x)
{
if(x==fa[x]) return x;
else return fa[x]=find(fa[x]);
}
void unit(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
else
{
if(deep[x]>deep[y]) fa[y]=x;
else
{
fa[x]=y;
if(deep[y]==deep[x]) deep[y]++;
}
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int main()
{
while(scanf("%d%d",&n,&m)&&n!=0)
{
init();
int sum=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].weight);
}
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++)
{
if(!same(edge[i].x,edge[i].y))
{
sum+=edge[i].weight;
unit(edge[i].x,edge[i].y);
}
}
printf("%d\n",sum);
}
return 0;
}
/*
Problem: 1287 User: lantianheyeqi
Memory: 4132K Time: 63MS
Language: C++ Result: Accepted
*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#define N 1005
#define INF 0x7fffffff
using namespace std;
int map[N][N];
int n,m;
int heap[N];
int pos[N];
int heapnum;
int dis[N];
void swap(int x,int y)
{
int t=heap[x];
heap[x]=heap[y];
heap[y]=t;
t=pos[heap[x]];
pos[heap[x]]=pos[heap[y]];
pos[heap[y]]=t;
}
void siftdown(int x)
{
int t;
while(2*x<=heapnum)
{
if(dis[heap[x]]>dis[heap[x*2]]) t=x*2;
else t=x;
if(x*2+1<=heapnum&&dis[heap[x*2+1]]<dis[heap[t]]) t=x*2+1;
if(x!=t)
{
swap(x,t);
x=t;
}
else break;
}
}
void siftup(int i)
{
while(i!=1)
{
if(dis[heap[i]]<dis[heap[i/2]])
{
swap(i,i/2);
i=i/2;
}
else break;
}
}
int pop()
{
int tt=heap[1];
heap[1]=heap[heapnum--];
siftdown(1);
return tt;
}
void init()
{
for(int i=1;i<=n;i++)
{
heap[i]=i;
pos[i]=i;
}
for(int i=heapnum/2;i>=1;i--) siftdown(i);
}
void prim()
{
int book[N];
memset(book,0,sizeof(book));
heapnum=n;
for(int i=1;i<=n;i++) dis[i]=map[1][i];
int sum=0;
book[1]=1;
dis[1]=0;
init();
pop();
for(int i=1;i<=n-1;i++)
{
int minpoint=pop();
book[minpoint]=1;
sum+=dis[minpoint];
for(int j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]>map[minpoint][j])
{
dis[j]=map[minpoint][j];
siftup(pos[heap[j]]);
}
}
}
printf("%d\n",sum);
}
int main()
{
while(scanf("%d%d",&n,&m)&&n!=0)
{
for(int i=1;i<N;i++)
{
for(int j=1;j<N;j++)
{
map[i][j]=INF;
}
}
for(int i=1;i<=m;i++)
{
int dx,dy,dz;
scanf("%d%d%d",&dx,&dy,&dz);
if(dz<map[dx][dy]) map[dx][dy]=map[dy][dx]=dz;
}
prim();
}
return 0;
}