标签:des blog java strong os art
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8992 Accepted Submission(s): 2519
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#define Maxint 0x7fffffff
int map[505][505],visit[505],low[505];
int n;
int prim()
{
int i,j,pos=1,minn,sum=0;
memset(visit,0,sizeof(visit));
visit[pos]=1;
for(i=1;i<=n;i++)
{
if(i!=pos)
{
low[i]=map[pos][i];
}
}
for(i=1;i<n;i++)
{
minn=Maxint;pos=-1;//判断图的连通性
for(j=1;j<=n;j++)
{
if(visit[j]==0 && minn>low[j])
{
minn=low[j];
pos=j;
}
}
if(pos == -1)return -1;
visit[pos]=1;
sum+=minn;
for(j=1;j<=n;j++)
{
if(visit[j] == 0&&low[j]>map[pos][j])
{
low[j]=map[pos][j];
}
}
}
return sum;
}
int main()
{
int m,k,t;
int i,j;
int p,q,c;
int y,s;
int str[505];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)map[i][j]=0;
else
map[i][j]=Maxint;
str[i]=Maxint;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&c);
if(c<map[p][q])
map[p][q]=map[q][p]=c;
}
for(i=1;i<=k;i++)
{
scanf("%d",&y);
for(j=1;j<=y;j++)
{
scanf("%d",&str[j]);
}
for(j=1;j<=y;j++)
{
for(s=j+1;s<=y;s++)
map[str[j]][str[s]]=map[str[s]][str[j]]=0;
}
}
bool flag=true;
int result=prim();
//for(i=1;i<=n;i++)
// if(visit == 0)
// {
// flag=false;
//}
//if(flag)
printf("%d\n",result);
// else
// printf("-1\n");
}
return 0;
}
/*
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 510
int map[MAXN][MAXN], lowcost[MAXN];
bool visit[MAXN];
int alr[MAXN];
int num, sum;
void prim()
{
int temp, k;
memset(visit, false, sizeof(visit));
for(int i = 1; i <= num; ++i)
lowcost[i] = map[1][i];
sum = 0;
visit[1] = true;
for(int i = 1; i <= num; ++i)
{
temp = INF;
for(int j = 1; j <= num; ++j)
if(!visit[j] && temp > lowcost[j])
temp = lowcost[k = j];
if(temp == INF)
break;
visit[k] = 1;
sum += temp;
for(int j = 1; j <= num; ++j)
if(!visit[j] && lowcost[j] > map[k][j])
lowcost[j] = map[k][j];
}
}
int main()
{
int ncase;
int road, already;
int a, b, cost;
int nodenum, node;
bool flag;
scanf("%d", &ncase);
while(ncase--)
{
flag = true;
memset(alr, INF, sizeof(alr));
memset(map, INF, sizeof(map));
scanf("%d%d%d", &num, &road, &already);
for(int i = 1; i <= road; ++i)
{
scanf("%d%d%d", &a, &b, &cost);
if(cost < map[a][b])
map[a][b] = map[b][a] = cost;
}
for(int i = 1; i <= already; ++i) //处理这些权值为0的边
{
scanf("%d", &nodenum);
for(int j = 1; j <= nodenum; ++j)
scanf("%d", &alr[j]);
int k;
for(int j = 1; j < nodenum; ++j)
{
k = j + 1;
map[alr[j]][alr[k]] = map[alr[k]][alr[j]] = 0;
}
}
prim();
for(int i = 1; i <= num; ++i) //判断图的连通性
if(visit[i] == false)
flag = false;
if(flag)
printf("%d\n", sum);
else
printf("-1\n");
}
return 0;
}
*/
给出了两种判断图连通的方法
hdu 3371 最小生成树prim算法,布布扣,bubuko.com
标签:des blog java strong os art
原文地址:http://www.cnblogs.com/ccccnzb/p/3832703.html