感觉自己对kruscal的算法掌握的比较熟了,这题就没有用2种解法解答了.
因为两种解法都是用自己写的模板来的,复制也没啥意思.
这题就是根据读入的数据,如果是修建状态是1的话,说明不用修建了,就将权重置为1,其他套模板;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 #define maxn 105 6 #define INF 0x3f3f3f3f 7 int mincost[maxn]; 8 int cost[maxn][maxn]; 9 bool visit[maxn]; 10 int n; 11 int prim() 12 { 13 int res = 0, index = 1,min_cost; 14 for(int i = 1;i <= n;i++) 15 mincost[i] = cost[i][1]; 16 mincost[1] = 0; 17 memset(visit,false,sizeof(visit)); 18 visit[1] = true; 19 for(int i = 1 ; i <= n; i++) 20 { 21 min_cost = INF; 22 for(int j = 1; j <= n; j++) 23 { 24 if(mincost[j]<min_cost && !visit[j]) 25 { 26 min_cost = mincost[j]; 27 index = j; 28 } 29 } 30 visit[index] = true; 31 for(int k = 1; k <= n; k++) 32 { 33 if(!visit[k] && cost[k][index] < mincost[k]) 34 mincost[k] = cost[k][index] ; 35 36 } 37 38 } 39 for(int i = 1 ;i <=n;i++) 40 res += mincost[i]; 41 return res; 42 } 43 int main() 44 { 45 //freopen("1879.txt","r",stdin); 46 int a,b,c,d; 47 while(~scanf("%d",&n),n) 48 { 49 memset(visit,false,sizeof(visit)); 50 memset(cost,INF,sizeof(visit)); 51 for(int i = 0 ;i< n*(n-1)/2 ; i++) 52 { 53 scanf("%d %d %d %d",&a,&b,&c,&d); 54 if(d == 0) 55 cost[a][b]=cost[b][a] = c; 56 else 57 cost[a][b]=cost[b][a] = 0; 58 } 59 printf("%d\n",prim()); 60 } 61 return 0; 62 }