您的位置:首页 > 其它

生成树模板(Prime + Kruskal)

2016-08-22 15:28 246 查看
//cost[i][j]表示到i,j两点的价值.lowc[i]表示当前状况下点i到集合A的价值
double prim(double cost[][MAXN],int n)//点从0~n-1
{
int i,j,p;
double minc,res=0;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(i=1; i<n; i++)
lowc[i]=cost[0][i];
for(i=1; i<n; i++)
{
minc=INF;
p=-1;
for(j=0; j<n; j++)
if(vis[j]==0&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
if(minc==INF)return -1;//原图不连通
res+=minc;
vis[p]=1;
for(j=0; j<n; j++)
if(vis[j]==0&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j];
}
return res;
}
int findx(int x)
{
return p[x] == x ? x : p[x] = findx(p[x]);
}
long long  Kruskal()
{
long long  ans = 0;
for(int i = 0; i < n; i ++)
p[i] = i;
sort(a,a + m);
for(int i = 0; i < m; i ++)
{
int x = findx(a[i].u);
int y = findx(a[i].v);
if(x != y)
{
ans += a[i].w;
p[x] = y;
}
}
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息