标签: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