prim 模板
int prim()
{
int s = 1;
int m = 1;
bool visit[30];
int min,flag;
memset(visit,false,sizeof(visit));
int dist[30];
for(int i=1;i<=n;i++)
dist[i] = inf;
int prim_weight = 0;
while(1)
{
if(m == n)
break;
min = inf;
for(int j=2;j<=n;j++)
{
if(!visit[j]&&dist[j]>map[s][j])
dist[j] = map[s][j];
if(!visit[j]&&min>dist[j])
{
min = dist[j];
flag = j;
}
}
s = flag;
visit[s] = true;
prim_weight += min;
m++;
}
return prim_weight;
}
poj 1251:
这道题一看到图就知道是最小生成树。。。。。模板题
源码:
#include <iostream>
#include <memory.h>
using namespace std;
int map[30][30];
int n;
const int inf = 1000000;
int prim()
{
int s = 1;
int m = 1;
bool visit[30];
int min,flag;
memset(visit,false,sizeof(visit));
int dist[30];
for(int i=1;i<=n;i++)
dist[i] = inf;
int prim_weight = 0;
while(1)
{
if(m == n)
break;
min = inf;
for(int j=2;j<=n;j++)
{
if(!visit[j]&&dist[j]>map[s][j])
dist[j] = map[s][j];
if(!visit[j]&&min>dist[j])
{
min = dist[j];
flag = j;
}
}
s = flag;
visit[s] = true;
prim_weight += min;
m++;
}
return prim_weight;
}
int main()
{
char temp;
int t;
char u;
int cost;
while(cin>>n)
{
if(!n)
break;
for(int i=1;i<n;i++)
for(int j=1;j<=n;j++)
map[i][j] = map[j][i] = inf;
for(int i=1;i<n;i++)
{
cin>>temp>>t;
for(int j=1;j<=t;j++)
{
cin>>u>>cost;
map[u-'A'+1][temp-'A'+1] = cost;
map[temp-'A'+1][u-'A'+1] = cost;
}
}
cout<<prim()<<endl;
}
return 0;
}