给你n个点,然后求最小生成树。特殊之处在于有q个点之间已经连上了边
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; const int maxn=505; int lowc[505]; bool vis[505]; int cost[maxn][maxn]; int n; int prim(int cost[][maxn],int n)//编号从1-n { int i,j,p; int minc,res=0; memset(vis,0,sizeof(vis)); vis[1]=1; for(i=1;i<=n;i++) lowc[i]=cost[1][i]; for(i=1;i<n;i++) { minc=INF; p=-1; for(j=1;j<=n;j++) if(vis[j]==0&&minc>lowc[j]) {minc=lowc[j];p=j;} if(minc==INF)return -1; res+=minc;vis[p]=1; for(j=1;j<=n;j++) if(vis[j]==0&&lowc[j]>cost[p][j]) lowc[j]=cost[p][j]; } return res; } int main() { int n,q; while(cin>>n) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>cost[i][j]; } } cin>>q; int a,b; for(int i=0;i<q;i++) { cin>>a>>b; cost[a][b]=0; cost[b][a]=0; } cout<<prim(cost,n)<<endl; } return 0; }