题意:与以前的做的MST的区别就是:该题有些路已经修完了,所以要特殊处理一下
思路:看代码。
//prime()算法: #include<iostream> #include<cstdio> #include<string.h> using namespace std; int map[111][111]; int vis[111]; int dis[111]; int N,Q; int prime(int pox) { int sum=0; for(int i=1; i<=N; i++) { dis[i]=map[pox][i]; } vis[pox]=1; for(int i=1; i<N; i++) { int Min=11111; int tem; for(int j=1; j<=N; j++) { if(!vis[j]&&dis[j]<Min) { Min=dis[j]; tem=j; } } vis[tem]=1; sum+=Min; for(int j=1; j<=N; j++) if(!vis[j]&&dis[j]>map[tem][j]) { dis[j]=map[tem][j]; } } return sum; } int main() { int gh; while(scanf("%d",&N)!=EOF) { memset(vis,0,sizeof(vis)); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) scanf("%d",&map[i][j]); scanf("%d",&gh); for(int i=0; i<gh; i++) { int a,b; scanf("%d%d",&a,&b); map[a][b]=map[b][a]=0; } printf("%d\n",prime(1)); } return 0; }
//kruskal(): #include<iostream> #include<cstdio> #include<queue> #include<string.h> #define maxn 111 using namespace std; int map[111][111]; int far[111]; int rank[111]; int N,q; struct node { int st; int ed; int w; bool friend operator <(const node &a,const node &b) { return a.w>b.w; } }; priority_queue<node>Q; void init() { for(int i=1; i<=N; i++) { far[i]=i; rank[i]=1; } } int find_set(int x) { if(far[x]==x) return x; far[x]=find_set(far[x]); return far[x]; } int kruskal(int gh) { int ans=0; node tem; int num=0; for(int i=1; i<=gh; i++) { tem=Q.top(); Q.pop(); int x=find_set(tem.st); int y=find_set(tem.ed); if(x!=y) { if(rank[x]>rank[y]) { far[y]=x; rank[x]+=rank[y]; } else { far[x]=y; rank[y]+=rank[x]; } ans+=tem.w; ++num; if(num==N) break; } } return ans; } int main() { node tem; while(scanf("%d",&N)!=EOF) { memset(map,0,sizeof(map)); while(!Q.empty()) Q.pop(); init(); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) scanf("%d",&map[i][j]); scanf("%d",&q); for(int i=1; i<=q; i++) { int a,b; scanf("%d%d",&a,&b); map[a][b]=map[b][a]=0; } int sum=0; for(int i=1; i<=N; i++) for(int j=i+1; j<=N; j++) { tem.st=i; tem.ed=j; tem.w=map[i][j]; Q.push(tem); sum++; } printf("%d\n",kruskal(sum)); } return 0; }