//prim看不懂的看看思想就容易懂啦
#include <stdio.h> #include <string.h> #define inf 0x3fffffff int map[101][101],flag[101],minpos[101],n,m,pos; void prim() { int t,p,min,sum=0; minpos[0]=t=1; flag[1]=1; while(t<n) { min=inf; for(int i=0;i<t;i++) { p=minpos[i]; for(int j=1;j<=n;j++) if(map[p][j]<min&&!flag[j]) min=map[p][j],pos=j; } sum+=min; minpos[t++]=pos; flag[pos]=1; } printf("%d\n",sum); } int main() { int a,b,cost,aci; while(scanf("%d",&n)!=EOF&&n) { m=n*(n-1)/2; memset(flag,0,sizeof(flag)); memset(map,inf,sizeof(map)); for(int i=0;i<m;i++) { scanf("%d %d %d %d",&a,&b,&cost,&aci); if(aci) map[a][b]=map[b][a]=0; else map[a][b]=map[b][a]=cost; } prim(); } return 0; }
//kruskal
<pre name="code" class="cpp">#include <stdio.h> #include <algorithm> using namespace std; int fa[105]; struct node { int a,b,cost; }c[5005]; bool cmp(node x,node y) { return x.cost<y.cost; } int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } int main() { int aci,n; while(scanf("%d",&n)!=EOF&&n) { for(int i=1;i<=n;i++) fa[i]=i; for(int i=0;i<n*(n-1)/2;i++) { scanf("%d %d %d %d",&c[i].a,&c[i].b,&c[i].cost,&aci); if(aci) c[i].cost=0; } sort(c,c+n*(n-1)/2,cmp); int sum=0; for(int i=0;i<n*(n-1)/2;i++) { int x_a=find(c[i].a); int y_b=find(c[i].b); if(x_a!=y_b) fa[x_a]=y_b,sum+=c[i].cost; } printf("%d\n",sum); } return 0; }
时间: 2024-10-06 15:24:58