http://acm.hdu.edu.cn/showproblem.php?pid=1879
prim是任意一点求最小生成树 求出来就是最小生成树的最小了
dijkstra是用起始点 结束点的最小生成树 起点终点不定 就用prim了
#include<stdio.h>
#define maxn 105
const int inf=100000000;
int n;
int g[maxn][maxn];
int dis[maxn];
bool vis[maxn];
int prim()
{
for(int i=1;i<=n;i++)
dis[i]=g[i][1],vis[i]=0;//任意一点
vis[1]=1;dis[1]=0;
int cost=0;
while(1)
{
int mindis=inf,idx=-1;
for(int i=1;i<=n;i++)
if(!vis[i])
if(dis[i]<mindis)
mindis=dis[i],idx=i;
if(idx==-1)
break;
cost+=dis[idx];//增加花费
vis[idx]=1;
for(int i=1;i<=n;i++)
if(!vis[i])
if(dis[i]>g[i][idx])
dis[i]=g[i][idx];
}
return cost;
}
int main()
{
while(scanf("%d",&n),n)
{
int m=n*(n-1)/2;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=i==j?0:inf;
while(m--)
{
int x,y,w,p;
scanf("%d%d%d%d",&x,&y,&w,&p);
if(p==1)
w=0;
if(g[x][y]>w)
g[x][y]=g[y][x]=w;
}
printf("%d\n",prim());
}
}