最小生成树,密集图,话不多说,直接上Prim。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <map>
#include <climits>
using namespace std;
typedef long long ll;
int n,distan[101][101];
bool visited[101];
struct Node{
int n,dis;
Node(int n0,int dis0):n(n0),dis(dis0){}
bool operator<(const Node &a)const{return dis>a.dis;}
};
void init(){
memset(visited,0,sizeof visited);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&distan[i][j]);
}
void prim(){
priority_queue<Node> que;
que.push(Node(1,0));
int ans=0;
for(int i=1;i<=n;){
Node top=que.top();
que.pop();
if(visited[top.n]){continue;}
visited[top.n]=1;
ans+=top.dis;
for(int j=1;j<=n;j++){
if(!visited[j])
que.push(Node(j,distan[j][top.n]));
}
i++;
}
cout<<ans<<endl;
}
int main(){
while(cin>>n){
init();
prim();
}
return 0;;
}