题目链接:击点
#include<stdio.h> #include<string.h> #include<algorithm> #define N 105 #define Max 6000 #define MAX 10000 using namespace std; int Map[N][N],nodeset[N]; bool vis[N]; struct Rode { int x,y,w; }r[Max]; bool cmp(Rode a,Rode b) { if(a.w<b.w) return true; return false; } int Kruscal(int n,int k) { int top=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i<j) { r[top].x=i; r[top].y=j; r[top].w=Map[i][j]; top++; } } } sort(r,r+top,cmp); int m=k,min=0; top=0; while(m<n-1) { if(!vis[r[top].x]&&vis[r[top].y]) { m++; vis[r[top].x]=true; nodeset[r[top].x]=nodeset[r[top].y]; min+=r[top].w; } else if(vis[r[top].x]&&!vis[r[top].y]) { m++; vis[r[top].y]=true; nodeset[r[top].y]=nodeset[r[top].x]; min+=r[top].w; } if(!vis[r[top].x]&&!vis[r[top].y]) { m++; vis[r[top].x]=true; vis[r[top].y]=true; nodeset[r[top].x]=nodeset[r[top].y]; min+=r[top].w; } else { if(nodeset[r[top].x]!=nodeset[r[top].y]) { m++; int tmp=nodeset[r[top].x]; for(int z=0;z<=n;z++) if(tmp==nodeset[z]) nodeset[z]=nodeset[r[top].y]; min+=r[top].w; } } top++; } return min; } void Init(int n) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) Map[i][j]=MAX; for(int i=0;i<=n;i++) nodeset[i]=i; } int main() { int n; while(~scanf("%d",&n)) { Init(n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&Map[i][j]); int k,BIT=0; scanf("%d",&k);//修建的路可能重复修建. for(int i=1;i<=k;i++) { int a,b; scanf("%d%d",&a,&b); if(!vis[a]&&vis[b]) { BIT++; vis[a]=true; nodeset[a]=nodeset[b]; } else if(vis[a]&&!vis[b]) { BIT++; vis[b]=true; nodeset[b]=nodeset[a]; } else if(!vis[a]&&!vis[b]) { BIT++; vis[a]=true; vis[b]=true; nodeset[a]=nodeset[b]; } else { if(nodeset[a]!=nodeset[b]) { BIT++; int tmp=nodeset[a]; for(int x=0;x<=n;x++) if(nodeset[x]==tmp) nodeset[x]=nodeset[b]; } } Map[a][b]=MAX; Map[b][a]=MAX; } printf("%d\n",Kruscal(n,BIT)); } }
Kruscal 写的太挫了,需要努力精简代码啊。