题意:
一个图,给你N个结点,输入N-1行信息,用大写字母表示节点,节点与节点之间有权值。要你输出最小生成树的值。
题解:
把子母转换成数字就好了,直接上板子。
//后来再次写的prim
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int MAXN=30;
int map[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int n,m;
void prim()
{
int sum=0;
memset(vis,false,sizeof(vis));
for(int i=1;i<=26;i++)
dis[i]=map[1][i];
vis[1]=true;
for(int i=1;i<n;i++)//把这里改成n就不用在下面判断k==0就continue了。
{
int MIN=INF,k=0;
for(int j=1;j<=n;j++)
if(dis[j]<MIN&&!vis[j])
MIN=dis[j],k=j;
sum+=MIN;
vis[k]=true;
for(int j=1;j<=n;j++)
if(!vis[j]&&map[k][j]<dis[j])
dis[j]=map[k][j];
}
printf("%d\n",sum);
}
int main()
{
while(cin>>n,n)
{
memset(map,INF,sizeof(map));
for(int i=0;i<=26;i++)
map[i][i]=0;
for(int i=0;i<n-1;i++)
{
char s1,s2;
cin>>s1>>m;
int a=s1-64;
for(int j=0;j<m;j++)
{
int w;
cin>>s2>>w;
int b=s2-64;
if(w<map[a][b])
map[a][b]=map[b][a]=w;
}
}
prim();
}
return 0;
}
//之前写的prim
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f;
int map[305][305],lowcost[305],mst[305];
int prim()
{
int i,j,sum=0;
for(i=2;i<=26;i++)//i不能等于1,否则会影响下面的程序。因为1已经在集合里了,不能再啦出来算一次
{
lowcost[i]=map[1][i];
mst[i]=1;
}
mst[1]=0;
for(i=2;i<=26;i++)
{
int min=INF,k=0;
for(j=1;j<=26;j++)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(k==0)
continue;
sum+=min;
lowcost[k]=0;
// printf("%d,,,,%d\n",sum,k);
for(j=1;j<=26;j++)
{
if(lowcost[j]!=0&&map[k][j]<lowcost[j])
{
lowcost[j]=map[k][j];
mst[k]=j;
}
}
}
return sum;
}
int main()
{
int n,m,i,j,l;
char a,b;
while(cin>>n)
{
if(n==0)
break;
memset(map,INF,sizeof(map));
memset(lowcost,0,sizeof(lowcost));
memset(mst,0,sizeof(mst));
for(i=1;i<n;i++)
{
getchar();
cin>>a>>m;
a=a-64;
// printf("a=%d\n",a);
for(j=1;j<=m;j++)
{
getchar();
cin>>b;
b=b-64;
// printf("b=%d\n",b);
cin>>l;
if(map[a][b]>l)
map[a][b]=map[b][a]=l;
}
}
int ans=prim();
cout<<ans<<endl;
}
}
//kruskal板子
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=27*27;
struct node
{
int u,v,w;
}map[MAXN];
int fa[MAXN];
int n,m,k;
bool cmp(node c,node d)
{
return c.w<d.w;
}
int find(int p)
{
return fa[p]==p ? p:fa[p]=find(fa[p]);
}
void kruskal()
{
int sum=0;
for(int i=0;i<k;i++)
{
int P=find(map[i].u);
int Q=find(map[i].v);
if(P!=Q)
{
fa[P]=Q;
sum+=map[i].w;
}
}
printf("%d\n",sum);
}
int main()
{
while(cin>>n,n)
{
k=0;
char s1,s2;
int a,b,w;
for(int i=0;i<=26;i++)
fa[i]=i;
for(int i=1;i<n;i++)
{
cin>>s1>>m;
for(int j=1;j<=m;j++)
{
cin>>s2>>w;
a=s1-64;
b=s2-64;
map[k].u=a;
map[k].v=b;
map[k].w=w;
k++;
}
}
sort(map,map+k,cmp);
kruskal();
}
}