这是一个典型的Prim算法应用,在具体的这个1258中碰到一些小accident,
由于是多case的,所以每次都需要把flag,U_Set清空掉,便于下一次执行
- #include<iostream>
- #include<cstdio>
- #include <vector>
- using namespace std;
- const int MAX = 101;
- const int INF = 100001;
- int c[MAX][MAX];
- bool flag[MAX];
- vector<int> U_Set;
- int Prim(int n)
- {
- int ans = 0;
- U_Set.push_back(1);
- flag[1] = true;
- for(int i = 1; i < n; i++)
- {
- int start = 1;
- int k = 1;
- int end = 1;
- int min = INF;
- int U_len = U_Set.size();
- for(int p=0;p<U_len;p++) {
- start = U_Set[p];//每次取出U集合中一个点,与不是U集合中的点比较,取路程最小的一个
- for(k=1;k<=n;k++)
- {
- if(start!=k&&c[start][k]<min &&!flag[k])
- {
- min = c[start][k];
- end = k;
- }
- }
- }
- //找到那个点以后,flag置为true
- flag[end] = true;
- U_Set.push_back(end);
- //边为start----end
- //把这两个点之间的长度 add ans
- ans += min;
- }
- return ans;
- }
- int main() {
- int i, j, n, m;
- while(scanf("%d",&n)!=EOF) {
- for(i = 1; i <= n; i++)
- {
- for(j = 1; j <=n; j++)
- {
- cin>>c[i][j];
- }
- }
- memset(flag,0,sizeof(flag));
- U_Set.clear();
- cout<<Prim(n)<<endl;
- }
- return 0;
- }