题目链接:点击打开链接
对于kruskal还不太掌握,,基本上是照着别人模板打的代码,还要继续加强,,prim的话,还好,,下面是两种AC过得方法:
kruskal:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define N 105
using namespace std;
int vis[N];
int n,m,sum;
struct node{
int a,b,c;
}str[N*N];
int find(int a){
if(vis[a]==a) return a;
return vis[a]=find(vis[a]);
}
int link(node t){
int a=find(t.a);int b=find(t.b);
if(a!=b){
vis[a]=b;
return t.c;
}
return 0;
}
int cmp(node a,node b){
return a.c<b.c;
}
void kruskal(){
int i;
sum=0;
sort(str+1,str+m+1,cmp);
for(i=1;i<=m;i++){
sum+=link(str[i]);
}
}
int main(){
while(~scanf("%d",&n)!=EOF&&n){
int i,d;
for(i=1;i<=n;i++){
vis[i]=i;
}
m=n*(n-1)/2;
for(i=1;i<=m;i++){
//cin>>str[i].a>>str[i].b>>str[i].c>>d;
scanf("%d%d%d%d",&str[i].a,&str[i].b,&str[i].c,&d);
if(d==1) {
str[i].c=0;
}
}
kruskal();
//cout<<sum<<endl;
printf("%d\n",sum);
}
return 0;
}
prim:
#include <iostream>
#include <string.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define N 105
using namespace std;
int n,m,sum;
int mapp[N][N],dis[N],vis[N];
void prim(int x){
memset(vis,0,sizeof(vis));
int i,j;
sum=0;
for(i=1;i<=n;i++){
dis[i]=mapp[x][i];
}
dis[x]=0;vis[x]=1;
for(i=1;i<n;i++){
int minn=INF,l;
for(j=1;j<=n;j++){
if(vis[j]==0&&dis[j]<minn){
minn=dis[j];
l=j;
}
}
if(minn==INF) break;
sum+=minn;
vis[l]=1;
for(j=1;j<=n;j++){
if(vis[j]==0&&dis[j]>mapp[l][j])
dis[j]=mapp[l][j];
}
}
}
int main(){
int a,b,c,d;
while(scanf("%d",&n)!=EOF&&n){
m=n*(n-1)/2;
int i;
memset(mapp,0,sizeof(mapp));
for(i=1;i<=m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==1) mapp[a][b]=mapp[b][a]=0;
else mapp[a][b]=mapp[b][a]=c;
}
prim(1);
printf("%d\n",sum);
}
return 0;
}