标签:oge memset 矩阵 for eof blog class span 构造
题意:给你一个n^2的邻接矩阵,表示u到v的距离,问你要让所以农场通网需要多长网线。
题解:用prim算法,从一个结点开始构造生成树,每次选当前子图和图外结点权值最小的边,把图外结点加入子图中。
prim比kruskal更适合稠密图,未优化的prim时间复杂的为O(u^2),kruskal时间复杂的为O(eloge)
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const int inf = 0x3f3f3f3f; 5 int cost[110][110], lowc[110], vis[110]; 6 int n; 7 8 int prim() 9 { 10 memset(vis,0,sizeof(vis)); 11 int minc,res=0,p; 12 vis[0]=1; 13 for(int i=0;i<n;i++) 14 lowc[i]=cost[0][i]; 15 for(int i=1;i<n;i++) 16 { 17 minc=inf; 18 p=-1; 19 for(int j=0;j<n;j++) 20 { 21 if(vis[j]==0&&lowc[j]<minc) 22 { 23 minc=lowc[j]; 24 p=j; 25 } 26 } 27 if(minc==inf) 28 return -1; 29 res+=minc; 30 vis[p]=1; 31 for(int j=0;j<n;j++) 32 if(vis[j]==0&&lowc[j]>cost[p][j]) 33 lowc[j]=cost[p][j]; 34 } 35 return res; 36 } 37 38 int main() 39 { 40 while(~scanf("%d", &n) && n) 41 { 42 for(int i = 0; i < n; i++) 43 for(int j = 0; j < n; j++) 44 scanf("%d", &cost[i][j]); 45 printf("%d\n", prim()); 46 } 47 }
标签:oge memset 矩阵 for eof blog class span 构造
原文地址:http://www.cnblogs.com/kearon/p/7669129.html