雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最小生成树裸题——pku1287

Posted on 2011-02-17 08:50  huhuuu  阅读(273)  评论(0编辑  收藏  举报
一次prim就秒杀……注意是无向图
View Code
#include<stdio.h>

#define MAX 0x3fffffff
int map[105][105],dis[105];
bool use[105];
int n,m;

void prim(int start)
{
int min,rj,i,j,add;
for(j=1;j<=n;j++)
{
dis[j]
=map[1][j];
use[j]
=0;
}
use[
1]=1;
add
=0;
for(i=1;i<n;i++)
{
min
=MAX;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]<min)
{
min
=dis[j];
rj
=j;
}
}

use[rj]
=1;
add
+=min;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]>map[rj][j])
dis[j]
=map[rj][j];
}
}
printf(
"%d\n",add);
}

int main()
{
int i,j,a,b,temp;
while(scanf("%d",&n),n)
{
scanf(
"%d",&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]
=MAX;
}
}
for(i=1;i<=m;i++)
{
scanf(
"%d%d",&a,&b);
scanf(
"%d",&temp);
if(temp<map[a][b])
{
map[b][a]
=temp;
map[a][b]
=temp;//重边的情况,加着总没错
}
}

prim(
1);
}
}

#include<stdio.h>

#define MAX 0x3fffffff
bool use[105];
int map[105][105];

int main()
{
int n,m,i,j,k,a,b,temp;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]
=MAX;
}
use[i]
=0;
}
scanf(
"%d",&m);
for(i=1;i<=m;i++)
{
scanf(
"%d%d",&a,&b);
scanf(
"%d",&temp);

if(temp<map[a][b])
{
map[a][b]
=temp;
map[b][a]
=temp;
}
}

int min,rj,add=0;
use[
1]=1;
for(k=1;k<n;k++)
{
min
=MAX;

for(i=1;i<=n;i++)
{
if(use[i]==1)
for(j=1;j<=n;j++)
{
if(use[j]==0&&min>map[i][j])
{
min
=map[i][j];
rj
=j;
}
}
}
use[rj]
=1;
add
+=min;
}

printf(
"%d\n",add);
}
}