|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码是残缺的,希望有大佬能帮帮我
城市间道路铺设问题
实现图的最小生成树问题的克鲁斯卡尔算法。
输入:
第一行两个整数,分别表示顶点个数n和边数m,从第二行到第m+1行,每行三个整数分别表示每条边的两个顶点号及权值。
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
输出:
依次输出选中的n-1条边及最小生成树的权值之和
1 3 1
4 6 2
2 5 3
3 6 4
2 3 5
15
- #include<bits\stdc++.h>
- using namespace std;
- struct edge{
- int u,v,weight;
- }e[100];
- void initialize(int n){
- for(int i=0;i<n;i++){
-
- }
- }
- int Find(int i){
-
- }
- void merge(int i,int j){
- if() return false;
- return true;
- }
- int Kruskal(int n, **e){
- int k,j,a,b;
- Sort(e, weight); //将边按权重从小到大排序
- initialize(n); //初始时每个顶点为一个集合
- k = j =1; //k累计已选边的数目,j为所选的边在e中的序号
- while (k < n){ //选择n - 1条边
- a = Find(e[j]);
- b = Find(e[j]); //找出第j条边两个端点所在的集合
- if (a != b) { //若不同,第j条边放入树中并合并这两个集合
- t[k++] = j;
- merge(a, b);
- }
- j++;
- }
- } //继续考察下一条边
- int main(){
- int n,m;
- printf("请输入顶点个数n和边数m\n");
- scanf("%d%d",&n,&m);
- printf("\n请输入每条边对应的顶点号以及对应的权值\n");
- int i,j;
- for (i=0;i<m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].weight);
-
- return 0;
- }
复制代码
- #include <iostream>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define IOS \
- ios::sync_with_stdio(false); \
- cin.tie(0); \
- cout.tie(0)
- const int N = 1e5+5,M = 2e5+5;
- int n,m;
- int p[N],path[N];
- int find(int a){
- if (p[a] != a) p[a] = find(p[a]);
- return p[a];
- }
- struct Edge{
- int a,b,w;// 需要对边排序,用结构体存储
- bool operator< (const Edge& W) const{
- return w < W.w;// 重载小于号
- }
- }edge[M];
- int kruskal(){
- sort(edge + 1,edge + m + 1);// 数组从下标为1开始存边
- for (int i = 1; i <= n; i ++ ) p[i] = i;// 初始化并查集
-
- int res = 0,cnt = 0;// res存放最小生成树的边权之和,cnt存放最小生成树的边数
- for (int i = 1;i <= m;i ++){
- int a = edge[i].a,b = edge[i].b,w = edge[i].w;
- a = find(a),b = find(b);
- if (a != b){
- p[a] = b;
- res += w;
- cnt ++;
- path[cnt] = i;
- }// n个点一共n-1条边
- if (cnt == n-1) break;// 处理完提前退出
- }
- return res;
- }
- int main(){
- IOS;
-
- cin >> n >> m;
- int u,v,w;
- for (int i = 1; i <= m; i ++ ){
- cin >> u >> v >> w;
- edge[i] = {u,v,w};
- }
-
- int res = kruskal();
- for (int i = 1;i <= n-1;i ++){
- int id = path[i];
- cout << edge[id].a << ' ' << edge[id].b << ' ' << edge[id].w << '\n';
- }
- cout << res << '\n';
- return 0;
- }
复制代码
自己写的,没有按照你给的代码
|
|