POJ 3723
2024-10-10 04:06:28
最大生成树
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<list>
#include<vector>
using namespace std;
const int maxn = 50000 + 131;
const int maxm = 10000 + 131;
struct Edge {
int u, v, cost;
Edge(int u_, int v_, int c_): u(u_), v(v_), cost(c_) {}
bool operator < (const Edge a) const {
return cost > a.cost;
}
};
vector<Edge> G; /// Uinon-Set
int Pre[maxm * 2], Num[maxm * 2];
void Init(int N) {
for(int i = 0; i <= N; ++i)
Pre[i] = i;
} int Find(int x) {
/*int r = x;
while(r != Pre[r]) r = Pre[r];
return Pre[x] = r;*/
if(x == Pre[x]) return x;
else return Pre[x] = Find(Pre[x]);
} bool Union(int x, int y) {
int ax = Find(x), ay = Find(y);
if(ax == ay) return false;
Pre[ax] = ay;
return true;
} /// MST;
typedef long long LL;
LL Sum = 0;
LL Kusual(int N,int R)
{
Sum = 0;
sort(G.begin(),G.end());
Init(N);
for(int i = 0; i < G.size(); ++i)
{
int u = G[i].u, v = G[i].v;
if(Union(u, v))
{
Sum +=(LL) (G[i].cost);
}
}
return Sum;
} int main()
{
int N, M, R;
int x, y, d;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d", &N, &M, &R);
G.clear();
for(int i = 0; i < R; ++i)
{
scanf("%d%d%d", &x, &y, &d);
G.push_back(Edge(x,y+N,d));
G.push_back(Edge(y+N,x,d));
}
//cout << Sum << endl;
//Sum = 0;
printf("%lld\n",(LL)(10000 * (N+M)) - Kusual(N+M,R));
}
}
最新文章
- 学习Git的总结与体会
- 浅谈Runloop
- Android lint 删除无用图片文件和配置文件
- C#拉姆达(=>;)表达式
- 傅里叶变换 fft_generic halcon
- freetds链接错误
- OSPF虚链路配置.示例2
- Mongodb Java Driver 参数配置解析
- 关于BigDecimal的四舍五入和截断 (2007-08-10 15:06:26)
- 贪心算法(2)-Kruskal最小生成树
- Black Box《优先队列》
- Selenium 切换句柄
- CSS3渐变相关
- 命令行下编译Wordcount
- Angular2+实现右键菜单的重定义--contextmenu
- 多节点通过PPP连接,节点/用户/客户机之间互相访问ping
- vue-cli 发布部署IIS
- 关于Vue单页面实现微信分享的Bug
- Android-textview图文混排(网络图片)
- Contest2073 - 湖南多校对抗赛(2015.04.06)