<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。</span>
5
非常简单的最小生成树,直接套模板就可以了。
k'ru'skal 算法:
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int p[200],n,m; struct node { int st, en, len; }E[200*200]; bool cmp(node &a, node &b) { return a.len < b.len; } int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } int kruskal() { int ans = 0; for (int i = 1;i <=n;i++) p[i] = i; for (int i = 0;i < m;i++) { int xx = find(E[i].st),yy=find(E[i].en); if (xx != yy) { ans += E[i].len; p[xx] = yy; } } return ans; } int main() { int i, j; while (cin >> n) { if (n == 0) break; m = (n - 1)*n / 2; for (i = 0;i < m;i++) cin >> E[i].st >> E[i].en >> E[i].len; sort(E, E + m, cmp); int ans = kruskal(); cout << ans << endl; } return 0; }
#include"iostream" #include"cstring" #include"cstdio" #define INF 0x7f7f7f7f #define MAXN 1005 using namespace std; int n,m; int maze[MAXN][MAXN]; bool vis[MAXN]; int dis[MAXN]; void prim() { int ans = 0; dis[1] = 0; for(int i = 1;i <= n;i++) { int mark = INF; int minn = INF; for(int j = 1;j <= n;j++) { if(!vis[j] && dis[j] < minn) { minn = dis[j]; mark = j; } } vis[mark] = true; ans += dis[mark]; for(int j = 1;j <= n;j++) { if(!vis[j] && maze[mark][j] < dis[j]) { dis[j] = maze[mark][j]; } } } printf("%d\n",ans); } int main(void) { while(scanf("%d",&n)!=EOF) { if(n==0) break; m=(n-1)*n/2; memset(maze,INF,sizeof(maze)); memset(vis,false,sizeof(vis)); memset(dis,INF,sizeof(dis)); while(m--) { int x,y,len; scanf("%d%d%d",&x,&y,&len); if(x != y && maze[x][y] > len) { maze[x][y] = len; maze[y][x] = len; } } prim(); } return 0; }