Minimum Spanning Tree problem.
Kruskal. merge if an edge already exists.
Find the minimum value. No pitfalls.
G ++ AC.
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#include<queue>#include<map>#include<stack>#include<iostream>#include<list>#include<set>#include<cmath>#define INF 0x7fffffff#define eps 1e-6using namespace std;int n,m;int fa[101];int father(int x){ if(x!=fa[x]) return fa[x]=father(fa[x]);}struct lx{ int u,v,len;}l[101*101];bool cmp(lx a,lx b){ return a.len<b.len;}int main(){ while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) fa[i]=i; int cot=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int len; scanf("%d",&len); if(i==j)continue; l[cot].u=i; l[cot].v=j; l[cot++].len=len; } } sort(l,l+cot,cmp); scanf("%d",&m); while(m--) { int u,v; scanf("%d%d",&u,&v); u=father(u); v=father(v); if(u==v)continue; fa[v]=u; } int ans=0; for(int i=0;i<cot;i++) { int u=father(l[i].u); int v=father(l[i].v); if(u==v)continue; fa[v]=u; ans+=l[i].len; } printf("%d\n",ans); }}