最小生成树
Prim算法
也可以判定原图是否为连通图。
struct node
{
int x,y,w;
bool operator < (const node &b)const
{
return w<b.w;
}
};
int a[100][100];
bool v[100];
int n,max1=2<<20;
multiset<node>te;
multiset<node>::iterator it;
void work(int i)
{
node e;
v[i]=1;
for(int j=1;j<=n;j++)
{
if(a[i][j]<max1)
{
e.x=i;e.y=j;e.w=a[i][j];
te.insert(e);
}
}
}
void prim()
{
node t[100];
node e;
int total,k;
memset(v,0,sizeof(v));
total=0;
work(1);
for(k=1;k<=n-1;k++)
{
do{
it=te.begin();
e=*it;
te.erase(it);
}while(!v[e.x]||!v[e.y]);
total+=e.w;
t[k]=e;
if(v[e.x]==0)
work(e.x);
if(v[e.y]==0)
work(e.y);
}
cout<<total<<endl;
for(k=1;k<=n-1;k++)
cout<<'('<<t[k].x<<','<<t[k].y<<','<<t[k].w<<')'<<endl;
}
Kruskal算法
struct node
{
int x,y,w;
bool operator < (const node &b)const
{
return w<b.w;
}
};
node g[100];
int s[100];
int n;
int get(int i)
{
int r;
if(s[i]==i)
return i;
else
{
r=get(s[i]);
s[i]=r;
return r;
}
}
void kruskal()
{
node t[100];
int total,k,i,f,x,y;
for(i=1;i<=n;i++)
s[i]=i;
total=0;f=-1;
for(k=1;k<=n-1;k++)
{
do{
f++;
x=get(g[f].x);
y=get(g[f].y);
}while(x==y);
total+=g[f].w;
t[k]=g[f];
s[x]=y;
}
cout<<total<<endl;
for(k=1;k<=n-1;k++)
cout<<'('<<t[k].x<<','<<t[k].y<<','<<t[k].w<<')'<<endl;
}