生成树算法
#include "stdio.h"
int table[105][105]; int e[5005][3]; int qu[5005]; int node[105];
int judge(int a,int b) { if(e[qu[a]][2]>e[qu[b]][2])return 1; if(e[qu[a]][2]<e[qu[b]][2])return -1; return 0; }
void swap(int a,int b) { int t; t=qu[a]; qu[a]=qu[b]; qu[b]=t; }
int partion(int low,int high,int p) { while(low<=high) { if(low<p) { if(judge(low,p)>0){swap(low,p);p=low;} low++; } else { if(high>p) { if(judge(high,p)<0){swap(high,p);p=high;} } high--; } } return p; }
void qsort(int left,int right) { int middle; if(left<right) { middle=(left+right)/2; middle=partion(left,right,middle); qsort(left,middle-1); qsort(middle+1,right); } }
void make(int p) { int i; for(i=0;i<p;i++)node[i]=-1; }
int find(int a) { int i; if(node[a]<0)return a; i=find(node[a]); node[a]=i; return i; }
void un(int a,int b) { int ra=find(a); int rb=find(b);
if(node[ra]<node[rb]){node[ra]+=node[rb];node[rb]=ra;} else {node[rb]+=node[ra];node[ra]=rb;} }
int main() { int n,q,l,r; int i,j,en; int sum; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&table[i][j]); } }
scanf("%d",&q); for(i=0;i<q;i++) { scanf("%d%d",&l,&r); table[l-1][r-1]=table[r-1][l-1]=0; }
en=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(j<i){e[en][0]=i;e[en][1]=j;e[en++][2]=table[i][j];} } }
for(i=0;i<en;i++)qu[i]=i; qsort(0,en-1);
sum=0; make(n); for(i=0;i<en;i++) { if(find(e[qu[i]][0])!=find(e[qu[i]][1])) { sum+=e[qu[i]][2]; un(e[qu[i]][0],e[qu[i]][1]); } }
printf("%d\n",sum); } return 0; }
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
公告
决定从线程开始!!
常用链接
留言簿(6)
随笔档案
搜索
最新评论
阅读排行榜
评论排行榜
|
|