题目:
链接:点击打开链接
题意:
中文
算法:
最小生成树
思路:
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110
#define MAX 100000000
int map[MAXN][MAXN];
int low[MAXN];
int vis[MAXN];
int n,m;
void prim()
{
int k,pos,minn;
int result = 0;
memset(vis,0,sizeof(vis));
pos = 1;
vis[pos] = 1;
for(int i=1; i<=n; i++)
{
if(i != pos)
low[i] = map[pos][i];
}
for(int i=1; i<n; i++)
{
minn = MAX;
for(int j=1; j<=n; j++)
{
if(!vis[j] && minn > low[j])
{
minn = low[j];
pos = j;
}
}
result += minn;
vis[pos] = 1;
for(int j=1; j<=n; j++)
{
if(!vis[j] && map[pos][j]<low[j])
low[j] = map[pos][j];
}
}
printf("%d\n",result);
}
int main()
{
//freopen("input.txt","r",stdin);
int a,b,c,d;
while(scanf("%d",&n) != EOF && n)
{
m = n*(n-1)/2;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d == 0)
map[a][b] = map[b][a] = c;
else
map[a][b] = map[b][a] = 0;
}
prim();
}
return 0;
}