c++编程一道难题

原问题:c++编程一道难题
分类:编程开发 > 最后更新时间:【2017-07-31 22:32:39】
问题补充:

题目描述

N个点,M条边,其中K条边必选,求所有点点之间都有可达的最小代价。数据保证有解。

输入

第一行两个整数n,m。第二行到m+1行,每行四个非负整数,p,u,v,w当p=1时,表示必选边;当p=2时,表示可选边;u,v,w一条无向边端点为u和v,权值为w。

输出

最小费用。

样例输入

561121123113411411225102255

样例输出

9

提示

数据范围:对于30%的数据,n<=10m<=100对于50%的数据,n<=200m<=1000对于100%的数据,n<=2000m<=10000

最佳答案

这个参考网上的:

#include<bits/stdc++.h>
using namespace std;
const int N = 2005;
const int M = 10005;
int f[N];
struct Edge
{
int p, u, v, w;
} a[M];
int cmp(Edge x, Edge y)
{
if(x.p == y.p) return x.w < y.w;
else return x.p < y.p;
}
int get(int x)
{
if(f[x] == x) return x;
f[x] = get(f[x]);
return f[x];
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++)
cin >> a[i].p >> a[i].u >> a[i].v >> a[i].w;
sort(a + 1, a + 1 + m, cmp);
int ans = 0;
for(int i = 1; i <= m; i++) ans += a[i].w;
for(int i = 1; i <= n; i++) f[i] = i;
for(int i = 1; i <= m; i++)
{
int root1 = get(a[i].u), root2 = get(a[i].v);
if(a[i].p == 1)
{
f[root1] = root2; //直接添加
continue;
}
if(root1 == root2) ans -= a[i].w;
else f[root1] = root2;
}
printf("%d\n", ans);
}


追问:
能不能简单一点。。。我看不懂 追答:
这些都是C++基本语法及普通算法,你哪部分没明白?
追问:
struct Edge{ int p, u, v, w;} a[M]; 追答:
这个是定义一个结构对C++来说,结构就是一个特殊的类(若学习C++没有学习类,等于没有学过C++,这点是公认的)它与一般类的区别是,它的成员都是公有的C语言也有结构的,这个你可以先在教材上看下相关的部分
  • 追答:
    且a[M]中的a是结构数组,对初学者来说是有点难(本来这道题目就不是针对初学者的)因为有二个概念,一个是结构,一个是数组不过任何C/C++教材上肯定全都有的
    最佳答案由网友  whoami1978  提供
  • 公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
    9

    分享到:

    其他回答

    暂无其它回答!

      推荐