Code:
#include <cstdio> #include <algorithm> #include <string> using namespace std; typedef long long ll; const int maxn=200003; namespace IO { inline void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } }; struct Edge { int u,v; ll c; }ed[maxn]; bool cmp(Edge a,Edge b) { return a.c < b.c; } int p[maxn],tag[maxn]; int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } int main() { // IO::setIO("input"); int n,m,i,j,edges=0; scanf("%d%d",&n,&m); for(i=1;i<=n+m+1;++i) p[i]=i; for(i=1;i<=n;++i) for(j=1;j<=m;++j) { ++edges; scanf("%lld",&ed[edges].c),ed[edges].u=i,ed[edges].v=j+n; } sort(ed+1,ed+1+edges,cmp); ll ans=0; for(i=1;i<=edges;++i) { int x=ed[i].u,y=ed[i].v; ll val=ed[i].c; x=find(x),y=find(y); if(x==y && !tag[x]) tag[x]=1, ans+=val; else if(x!=y&&(!tag[x]||!tag[y])) ans+=val, p[x]=y, tag[y]|=tag[x]; } printf("%lld\n",ans); return 0; }