最小生成树

zznu 1983
最小生成树的变形,关键是想不到,想到也就不会觉得难了
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<algorithm> #include <vector> #include <queue> using namespace std; #define INF 0x3f3f3f3f #define N 500 int maps[N][N]; int dist[N], vis[N]; void Init(int n) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) maps[i][j]=i==j ? 0 : INF; } int Prim(int n) { for(int i=1; i<=n; i++) dist[i]=maps[0][i]; memset(vis, 0, sizeof(vis)); vis[0]=1; int sum=0, Min, index; while(1) { Min=INF; for(int i=0; i<=n; i++) if(!vis[i]&&Min>dist[i]) { Min=dist[i]; index=i; } if(Min==INF) break; sum+=Min; vis[index]=1; for(int i=0; i<=n; i++) if(!vis[i]&&maps[index][i]<dist[i]) dist[i]=maps[index][i]; } return sum; } int main() { int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); Init(n); for(int i=0; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d", &maps[i][j]); int ans=Prim(n); printf("%d\n", ans); } return 0; }

 

posted on 2016-05-24 19:13  南风丶丶  阅读(112)  评论(0编辑  收藏  举报