并查集 Travel
来源:互联网 发布:mac 无损 图片拼接 编辑:程序博客网 时间:2024/06/07 00:36
问题 A: Travel
时间限制: 1 Sec 内存限制: 512 MB题目描述
输入
4 4 4
1 2 1
2 3 3
3 4 2
4 1 4
3 2
3 3
3 1
3 4
1 2 1
2 3 3
3 4 2
4 1 4
3 2
3 3
3 1
3 4
输出
2
4
1
4
4
1
4
提示
干找会超时。。可以利用刚刚做过的魔法森林的思路,因为对于一个询问的len,只可以走边权<=它的,因此把询问的len去重后按大小排序,每次只建边权小于等于它的边。更新询问的答案。
其实这样还会超时,所以不用建边了,用并查集的思想,把每个连通块合并在一起,记录size,size由最顶端祖先记录,查询时只要找此节点祖先的size就行了。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define N 100000using namespace std;int read(){int sum=0,f=1;char x=getchar();while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}while(x>='0'&&x<='9'){sum=(sum<<1)+(sum<<3)+x-'0';x=getchar();}return sum*f;}struct road{int v,next,l;} lu[4*N+5];struct node{int u,v,l;} f[4*N+5];struct Q{int id,x,len;} q[N+5];int n,m,k,adj[N+5],e,A[N+5],sz,sum;int ans[N+5],hh[N+5],fa[N+5];void add(int u,int v,int l){lu[++e].v=v;lu[e].l=l;lu[e].next=adj[u];adj[u]=e;}inline bool cmp(const Q &a,const Q &b){return a.len<b.len;}inline bool cmp1(const node &a,const node &b){return a.l<b.l;}int find(int x){if(fa[x]==x)return x;fa[x]=find(fa[x]);return fa[x];}void hb(int x,int y){int x1=find(x),y1=find(y);if(x1!=y1){fa[x1]=y1,hh[y1]+=hh[x1];}}int main(){//freopen("travel.in","r",stdin);//freopen("travel.out","w",stdout);n=read();m=read();k=read();int x,y,z;for(int i=1;i<=m;i++){f[i].u=read();f[i].v=read();f[i].l=read();}for(int i=1;i<=k;i++){q[i].x=read();q[i].len=read();q[i].id=i;A[i]=q[i].len;}for(int i=1;i<=n;i++)fa[i]=i,hh[i]=1;sort(A+1,A+k+1);sz=unique(A+1,A+k+1)-A-1;sort(q+1,q+k+1,cmp);sort(f+1,f+m+1,cmp1);int j=1,l=1;for(int i=1;i<=sz;i++){ // for(int j=1;j<=n;j++)cout<<fa[j]<<endl;if(l>k)break;for(;j<=m;j++){if(f[j].l>A[i])break; hb(f[j].u,f[j].v);}for(;l<=k;l++){if(q[l].len>A[i])break;ans[q[l].id]=hh[find(q[l].x)];}}for(int i=1;i<=k;i++) printf("%d\n",ans[i]);}
阅读全文
0 0
- Travel 并查集
- 并查集 Travel
- HDU5441 Travel 并查集
- HDU5441 Travel 并查集
- HDU 5441 Travel 并查集
- hdu 5441 Travel(离线+并查集)
- 离线+并查集 hdu5441 Travel
- hdu 5441 Travel(并查集应用)
- HDU5441 Travel 有秩并查集
- HDU 5441 Travel (并查集)
- HDU 5441 Travel(并查集)
- hdu 5441 Travel 排序 并查集
- [HDU 5441]Travel[并查集]
- HDU 5441 Travel 并查集
- HDU-5441 Travel(并查集)
- HDU 5441 Travel(并查集)
- HDU 5441 Travel (并查集)
- Hdu 5441 Travel(并查集)
- Linux 多线程----直接上代码----准备篇(一)
- 利用http协议下载文件的第一种方式
- 河南省多校连萌(三)【问题 C: QAQ & 火星情报局】
- Jade模板引擎
- 常用的解题技巧:尺取法
- 并查集 Travel
- HDU 1257 最少拦截系统
- BP神经网络
- Java30天笔记-XML
- P1720 月落乌啼算钱
- 输入字符串时的烦恼
- 深度神经网络
- 面经总结1——java集合框架
- Lesson02_C#基础_part04