prim算法适用于稠密图
kruskal算法适用于稀疏图
prim:
#include
#include
#include
#include
#include
#include
using namespace std;
const int LEN=105;
int path[LEN][LEN], vis[LEN], dis[LEN];
void prim(int& cost, const int& n)
{
int i, j, site;
for(i=1; i<=n; i++)
dis[i]=path[i][1], vis[i]=0;
vis[1]=1;
dis[1]=0;
cost=0;
for(i=2; i<=n; i++)
{
site=-1;
for(j=1; j<=n; j++)
{
if( vis[j] ) continue;
if( site==-1 || dis[j]path[j][site] )
dis[j]=path[j][site];
}
}
}
int main()
{
int N, i, j, a, b, Q;
while( cin>>N )
{
int cost=0;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
{
scanf("%d", &path[i][j]);
}
scanf("%d", &Q);
for(i=0; i
kruskal:
#include
#include
#include
#include
#include
using namespace std;
const int LEN=105;
int path[LEN][LEN], vis[LEN], dis[LEN];
struct node
{
int st, ed, w;
}road[LEN*LEN];
int find_fa(const int& a)
{
return vis[a]==a ? a : vis[a]=find_fa(vis[a]);
}
void unite(const int &x, const int &y)
{
if( x==y )
return ;
if( dis[x]>dis[y] )
vis[y]=x;
else
{
vis[x]=y;
if( dis[x]==dis[y] )
dis[y]++;
}
}
int cmp(const void *a, const void *b)
{
node x=*(node *)a;
node y=*(node *)b;
return x.w-y.w;
}
int kruskal(const int& n)
{
int cost=0, i, j, k=0;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
road[k].st=i;
road[k].ed=j;
road[k++].w=path[i][j];
}
qsort(road, k, sizeof(road[1]), cmp);
for(i=1; i<=n; i++)
{
vis[i]=i;
dis[i]=0;
}
k=0;
for(j=0; j>n )
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d", &path[i][j]);
scanf("%d", &Q);
for(i=0; i