hdu 3938(离线的并查集)
2012-10-13 13:37
369 查看
题意描述:简单的讲就是,给你一张无向图,求有多少条路径使得路径上的花费小于L,这里路径上的花费是这样规定的,a、b两点之间的多条路径中的最长的边最小值!
分析:因为考虑到数据的大小所以需采用离线算法先计算出结果后在统一输出结果!这里首先要从a到b的所有路径中筛选出这样一条路径(路径中的最长边是所有路径中最小),那么这就需要采用最小生成树kruskal的思想,那么任意两个集合A,B之间可以形成的路径即为num[A]*num[B](这里忽视了原来两集合中形成的条数,因为实现的时候要不断的累加以前的结果,详情见代码)
分析:因为考虑到数据的大小所以需采用离线算法先计算出结果后在统一输出结果!这里首先要从a到b的所有路径中筛选出这样一条路径(路径中的最长边是所有路径中最小),那么这就需要采用最小生成树kruskal的思想,那么任意两个集合A,B之间可以形成的路径即为num[A]*num[B](这里忽视了原来两集合中形成的条数,因为实现的时候要不断的累加以前的结果,详情见代码)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdio> #include<stack> #include<set> using namespace std; const int N= 10003; const int M= 50002; struct Node { int u,v; int len; } edge[M]; bool cmp(Node a,Node b) { return a.len<=b.len; } int fa ; int sum ; int n,m,q; void init() { for(int i=1; i<=n; i++) fa[i]=i,sum[i]=1; } int findx(int x) { return fa[x]=fa[x]==x?x:findx(fa[x]); } int Union(int a,int b) { int aa=findx(a); int bb=findx(b); if(aa==bb) return 0; else if(fa[aa]<fa[bb]) { fa[bb]=aa; int tmp=sum[aa]*sum[bb]; sum[aa]+=sum[bb]; return tmp; } else { fa[aa]=bb; int tmp=sum[aa]*sum[bb]; sum[bb]+=sum[aa]; return tmp; } } int ans ; struct Q { int L; int id; int ans; } que ; bool cmp1(Q a,Q b) { return a.L<=b.L; } bool cmp2(Q a,Q b) { return a.id<b.id; } int main() { while(scanf("%d%d%d",&n,&m,&q)!=EOF) { init(); for(int i=0; i<m; i++) scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].len); for(int i=0; i<q; i++) {scanf("%d",&que[i].L);que[i].id=i;que[i].ans=0;} sort(edge,edge+m,cmp); sort(que,que+q,cmp1); int cnt=0; for(int i=0; i<q; i++) { while(edge[cnt].len<=que[i].L&&cnt<m) { //cout<<"FFF"<<endl; int aa=findx(edge[cnt].u); int bb=findx(edge[cnt].v); if(aa==bb) { cnt++; continue; } else { que[i].ans+=Union(edge[cnt].u,edge[cnt].v); cnt++; } } if(i>=1) que[i].ans+=que[i-1].ans; } sort(que,que+q,cmp2); for(int i=0; i<q; i++) { printf("%d\n",que[i].ans); } } return 0; }
相关文章推荐
- HDU 3938 离线并查集
- hdu 3938(离线并查集)
- hdu 3938(离线的并查集)
- hdu 3938(离线的并查集)
- HDU-3938 Portal 克鲁斯卡尔思想 (离线并查集)
- 多校第十场 HDU 3938 Portal(离线的并查集)
- hdu 3938 Portal(离线并查集)
- hdu 3938 Portal离线并查集
- HDU 4750 && HDU 3938 离线并查集
- hdu 3938 Portal 计算两点路上最大距离中的最小值<=L的路径个数 离线并查集
- hdu 3938 Portal(离线并查集)
- 【HDU】3938 Portal 并查集
- HDU 5441 Travel (带权并查集 + 离线操作)
- HDU 5441 Travel (离线处理+并查集)
- hdu 5441 Travel 离线操作+并查集
- HDU 3726 Graph and Queries 离线处理 treap + 并查集
- HDU 5441 Travel (并查集 离线处理)
- 离线+带权并查集 hdoj3938 Portal
- hdu 4750 2013 ACM/ICPC Asia Regional Nanjing Online 1003 并查集+离线操作
- HDOJ 3938 Portal (离线并查集)