POJ 1287 Networking prim

http://poj.org/problem?id=1287

最小生成树,注意一点,无向边,还有重边等

代码:

#include<iostream>
#include<cstdio>
#define inf 1<<30
using namespace std;
int map[55][55],dis[55];
int n;

int prim(int x)
{
int i;
for( i=1;i<=n;i++)
dis[i]=map[x][i];
dis[x]=0;

int MIN,mark,k,SUM=0;
for(k=1;k<n;k++)
{
MIN=inf;
for(i=1;i<=n;i++)
{
if(dis[i]<MIN&&dis[i])//不能把dis[i]漏了
{
MIN=dis[i];
mark=i;
}

}
dis[mark]=0;
SUM+=MIN;
for(i=1;i<=n;i++)
{
if(dis[i]>map[mark][i])
dis[i]=map[mark][i];
}
}
return SUM;
}
int main()
{
int m,i,j,w;
while(~scanf("%d%d",&n,&m)&&n)//本来想刷个水题睡觉,两次TLE,因为没加&&n,什么破题!
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=inf;
while(m--)
{
scanf("%d%d%d",&i,&j,&w);
if(map[i][j]>w)
{
map[i][j]=w;
map[j][i]=w;
}
}
int ans=prim(1);
printf("%d\n",ans);
}
return 0;
}



posted @ 2012-02-20 02:37  快乐.  阅读(149)  评论(0编辑  收藏  举报