裸的kruskal。
ios
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> #include<map> #include<set> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<sstream> #define LL long long #define OJ_DEBUG 0 #define READ_FILE 0 using namespace std; const int NN_MAX = 110; const int MM_MAX = 100010; const int INF = 0x3fffffff; struct Edge{ int a,b,c; Edge (int a1=0,int b1=0,int c1=0):a(a1),b(b1),c(c1){} bool operator < (const Edge& chs)const{return c<chs.c;} }theEdge[NN_MAX*NN_MAX]; /**********************************************************/ int matx[NN_MAX][NN_MAX],p[NN_MAX*NN_MAX]; int lenEdge,ans; /**********************************************************/ int min_2 (int x,int y) {return x<y?x:y;} int max_2 (int x,int y) {return x>y?x:y;} void swap (int& a, int& b){a^=b;b^=a;a^=b;} int find (int i){return i==p[i]?i:p[i]=find(p[i]);} void kruskal (); /**********************************************************/ int main() { if (READ_FILE) freopen ("in.txt","r",stdin); int n,q; while (scanf ("%d",&n)!=EOF) { for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf ("%d",&matx[i][j]); scanf ("%d",&q); int a,b; for (int i=0;i<q;i++){ scanf ("%d %d",&a,&b); matx[a][b]=matx[b][a]=0; } lenEdge=0; for (int i=1;i<=n;i++) for (int j=i+1;j<=n;j++) theEdge[lenEdge++]=Edge(i,j,matx[i][j]); ans=0; for (int i=0;i<=n;i++) p[i]=i; kruskal (); printf ("%d\n",ans); } return 0; } void kruskal () { sort (theEdge,theEdge+lenEdge); for (int i=0;i<lenEdge;i++){ int x=find(theEdge[i].a), y=find(theEdge[i].b); if (x!=y){ ans+=theEdge[i].c; p[x]=y; } } }