您的位置:首页 > 其它

ural 1982. Electrification Plan (最小生成树)

2013-10-21 12:57 225 查看
重新理解了下最小生成树。。。

以前学的时候很多细节都忽略了。。。

比如:1、edge[i][j]=0是个很巧妙的设置。

2、求最小生成树,由于生成树是图的极小联通子图。最小生成树一定要包含图中

所有的点。

#include<cstdio>
#include<iostream>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;

int edge[110][110];
int vis[110],dis[110];
bool flag[110];
int n,k,ans;

void prim()
{
int u=1,minw;
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=edge[u][i];
}
vis[u]=1;
for(int i=1;i<n;i++)
{
minw=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j] && dis[j]<minw)
{
minw=dis[j];
u=j;
}
}
ans+=minw;
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j] && edge[u][j]<dis[j])
dis[j]=edge[u][j];
}
}
}

int main()
{
int d;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(flag,false,sizeof(flag));
ans=0;
for(int i=0;i<k;i++)
{
scanf("%d",&d);
flag[d]=true;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&edge[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(flag[i]&&flag[j])
edge[i][j]=0;
}
}
prim();
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: