其中fa[]数组起到的作用就是连接两个集合;
// File Name: 170c.cpp
// Author: rudolf
// Created Time: 2013年03月04日 星期一 16:19:34
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std;
int fa[200];
bool visit[200];
void init()
{
for(int k=0;k<200;k++)
fa[k]=k;
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
bool Union(int a,int b)
{
a=find(a);
b=find(b);
if(a==b)
return false;
fa[a]=b;
return true;
}
int a[200];
int main()
{
int n,m;
int ans;
while(cin>>n>>m)
{
memset(visit,false,sizeof(visit));
init();
ans=0;
int flag=0;
for(int i=0,num;i<n;i++)
{
cin>>num;
if(num==0)
ans++;
for(int j=0;j<num;j++)
{
flag=1;
cin>>a[j];
visit[a[j]]=true;
for(int z=0;z<j;z++)
Union(a[j],a[z]);
}
}
for(int i=1;i<=m;i++)
if(visit[i]&&fa[i]==i)
ans++;
cout<<ans-flag<<endl;
}
return 0;
}
最小生成树
在一个连通图G中,如果它的全部定点和一部分边构成一个子图G’,并且边集中的边既将所有的顶点连通又不形成回路,则称子图G’是原图的一棵生成树。
对于一个连通网(即连通带权图)来说,生成树不同,每棵树的权(即树中所有边上的权值和)也可能不同,权最小的生成树称为最小生成树。
a.必须使用该网络中的边来构造最小生成树;
b.必须使用且仅使用n-1条边来连接网络中的n个顶点;
c.不能使用产生回路的边;
利用prim算法建立最小生成树Void Graph<string, float>…
Prim(MinSpanTree&T){
int NumVertuces=VertucesList.Last; //图顶点数
Float *lowcost=new float[NumVertices];
Int * nearvex=new int[NumVertices];
For(int i=0;i<NumVertices;i++){//顶点0到各边的代价及最短带权路径
Lowcost[i]=Edge[0][i];
Nearvex[i]=0;}
Nearvex[0]=-1;//顶点0加到生成树顶点集合
MSTEdgeNode e;
For(i=1;i<NumVertices;i++){循环n-1次,加入n-1条边
Float min=MAXNUM;int v=0;
For(int j=0;j<NumVertices;j++)
If(nearvex[j]!=-1&&lowcost[j]<min){//求生成树外顶点到生成树内顶点具有最小权值的边,v是当前具有最小权值的边的位置
V=j;min=lowcost[j];}If(V){ //v==0表示再也找不到要求的顶点了
E.tail=nearvex[v]; e.head=v;
E.cost=lowcost[v];
T.insert(e); //选出的边加入生成树
Nearvex[v]=-1; //作该边已加入生成树的标记
For(j=1;j<NumVertices;j++)
If(nearvex[j]!=-1&&Edge[v][j]<lowcost[j]){//需要修改
Lowcost[j]=Edge[v][j];
Nearvex[j]=v;}}}}
时间复杂度分析
设连通网络有n个顶点,则该算法的时间复杂度为O(n2),与圈中边数无关,它适用于边稠密的网络。