Input
当N为0时输入结束。
Output
Sample Input
Sample Output
#include<stdio.h>
#include<string.h>#include<algorithm>
using namespace std;
int pre[100010];
struct node
{
int u,v,w;
} edge[100010];
void itin()
{
for(int i=0; i<100010; i++)
pre[i]=i;
}
int cmp(node s1,node s2)
{
return s1.w<s2.w;
}
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
bool join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
return 1;
}
return 0;
}
int main()
{
int a,b,c,d,i,j,t;
while(scanf("%d",&t),t)
{
itin();
int m=t*(t-1)/2;
for(i=0; i<m; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==1)
c=0;
edge[i].u=a;
edge[i].v=b;
edge[i].w=c;
}
sort(edge,edge+m,cmp);
int sum=0;
for(i=0; i<m; i++)
{
if(join(edge[i].u,edge[i].v))
sum+=edge[i].w;
}
printf("%d\n",sum);
}
}
prim:
#include <iostream>
#include<stdio.h>#include<string.h>
#include<stdlib.h>
using namespace std;
int g[1010][1010];
int p[1010];
int vis[1010];
int maxx=0x3f3f3f3f;
int main()
{
int n,a,b,c,d,e,i,z,t,j,minn,k,ans,ge;
for(;;)
{
scanf("%d",&n);
ge=0;
ans=0;
z=1;
memset(g,maxx,sizeof(g));
memset(p,maxx,sizeof(p));
memset(vis,0,sizeof(vis));
if(n==0)
break;
e=n*(n-1)/2;
for(i=1; i<=e; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==1)
{
if(z==0)
t=a;
vis[a]=1; 臭傻逼 我tm的 如果有三个点 你连了1 2 ,不用管1,,2 了 那你三怎么和他俩连起来??
臭傻逼
vis[b]=1;z++;
}
if(c<g[a][b])
{
g[a][b]=c;
g[b][a]=c;
}
}
for(i=1; i<=n; i++)
if(i==z)
p[i]=0;
else
p[i]=g[z][i];
vis[z]=1;
for(i=1;i<=n;i++)
if(vis[i]==1)
ge++;
for(i=1; i<=n; i++)
if(vis[i]==1&&i!=z)
for(j=1; j<=n; j++)
{
if(i==j)
p[j]=0;
else
{
if(p[j]>g[i][j])
p[j]=g[i][j];
if(p[j]>g[j][i])
p[j]=g[j][i];
}
}
for(i=ge+1; i<=n; i++)
{
minn=maxx;
k=-1;
for(j=1; j<=n; j++)
if(vis[j]!=1&&minn>p[j])
{
minn=p[j];
k=j;
}
ans+=minn;
vis[k]=1;
for(j=1; j<=n; j++)
{
if((vis[j]!=1&&p[j]>g[k][j]))
p[j]=g[k][j];
}
}
printf("%d\n",ans);
}
}
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int g[1010][1010];
int p[1010];
int vis[1010];
int maxx=0x3f3f3f3f;
int main()
{
int n,a,b,c,d,e,i,z,t,j,minn,k,ans,ge;
for(;;)
{
scanf("%d",&n);
ge=0;
ans=0;
z=1;
memset(g,maxx,sizeof(g));
memset(p,maxx,sizeof(p));
memset(vis,0,sizeof(vis));
if(n==0)
break;
e=n*(n-1)/2;
for(i=1; i<=e; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==1)
{
g[a][b]=0;
g[b][a]=0;
}
if(c<g[a][b])
{
g[a][b]=c;
g[b][a]=c;
}
}
vis[1]=1;
for(i=2; i<=n; i++)
p[i]=g[1][i];
for(i=2; i<=n; i++)
{
minn=maxx;
k=-1;
for(j=1; j<=n; j++)
if(vis[j]!=1&&minn>p[j])
{
minn=p[j];
k=j;
}
ans+=minn;
vis[k]=1;
for(j=1; j<=n; j++)
{
if((vis[j]!=1&&p[j]>g[k][j]))
p[j]=g[k][j];
}
}
printf("%d\n",ans);
}
}