uva1664 并查集
2015-08-04 17:28
405 查看
先对所有边按容量由大到小排序,然后遍历每条边。对于一条边AB,先找到他们各自的并查集,如果没有就初始化他们自己的并查集和并查集中元素的个数cnt,然后判断中心城市在A并查集或者B并查集那个好,即cap[A]+theEdge[i].c*cnt[B]和cap[B]+theEdge[i].c*cnt[A]那个大,然后将小的加入大的,更新cap和cnt。注意数据范围,cap使用long long。
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> #include<map> #include<set> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<sstream> #define ll long long #define OJ_DEBUG 0 #define READ_FILE 1 using namespace std; const int NN_MAX = 200000+100; //const int MM_MAX = NN_MAX*NN_MAX; const int INF = 0x3fffffff; struct Edge{ int l,r,c; //Edge (int a1,int a2,int a3) : //l(a1),r(a2),c(a3){} Edge (){} bool operator < (const Edge& rhs) const {return c>rhs.c;} }theEdge[NN_MAX]; /**********************************************************/ int n; int parent[NN_MAX],cnt[NN_MAX]; ll cap[NN_MAX]; /**********************************************************/ int min_2 (int x,int y) {return x<y?x:y;} int max_2 (int x,int y) {return x>y?x:y;} void swap (int& a, int& b){a^=b;b^=a;a^=b;} int find (int i) {return i==parent[i]?i:parent[i]=find(parent[i]);} /**********************************************************/ int main() { if (READ_FILE) freopen ("in.txt","r",stdin); while (scanf ("%d",&n)!=EOF) { for (int i=0;i<n-1;i++) scanf ("%d %d %d",&theEdge[i].l,&theEdge[i].r,&theEdge[i].c); sort (theEdge,theEdge+n-1); memset (parent,0,sizeof (parent)); memset (cap,0,sizeof (cap)); memset (cnt,0,sizeof (cnt)); for (int i=0;i<n-1;i++){ int x=theEdge[i].l, y=theEdge[i].r; if (!parent[x]) {parent[x]=x;cnt[parent[x]]++;} if (!parent[y]) {parent[y]=y;cnt[parent[y]]++;} int px=find (x),py=find (y); if (px!=py){ if (cap[px]+theEdge[i].c*cnt[py]>=cap[py]+theEdge[i].c*cnt[px]){ parent[py]=px; cap[px]+=(ll)theEdge[i].c*(ll)cnt[py]; cnt[px]+=cnt[py]; } else { parent[px]=py; cap[py]+=(ll) theEdge[i].c*(ll) cnt[px]; cnt[py]+=cnt[px]; } } } printf ("%lld\n",cap[find(1)]); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解