hdu 3938 Portal
http://acm.hdu.edu.cn/showproblem.php?pid=3938
这道题一开始没看懂题意,看了别人的博客之后才理解题意。用的是离线的并查集,输入完之后再处理。问的是在小于等于L的路径数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 200005 5 using namespace std; 6 7 int f[maxn],num[maxn]; 8 int n,m,Q; 9 struct node 10 { 11 int a,b,c; 12 bool operator <(const node &x)const 13 { 14 return c<x.c; 15 } 16 } p[maxn]; 17 18 struct nodeq 19 { 20 int id,l; 21 bool operator <(const nodeq &a)const 22 { 23 return l<a.l; 24 } 25 } q[maxn]; 26 27 int find1(int x) 28 { 29 if(x==f[x]) return x; 30 return f[x]=find1(f[x]); 31 } 32 33 int merge1(int a,int b) 34 { 35 int fa=find1(a); 36 int fb=find1(b); 37 if(fa==fb) return 0; 38 int m1; 39 m1=num[fa]*num[fb]; 40 num[fa]+=num[fb]; 41 f[fb]=fa; 42 return m1; 43 } 44 45 void inti() 46 { 47 for(int i=0; i<=n; i++) 48 { 49 f[i]=i; 50 num[i]=1; 51 } 52 } 53 int main() 54 { 55 while(scanf("%d%d%d",&n,&m,&Q)!=EOF) 56 { 57 inti(); 58 for(int i=0; i<m; i++) 59 { 60 scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c); 61 } 62 for(int i=0; i<Q; i++) 63 { 64 scanf("%d",&q[i].l); 65 q[i].id=i; 66 } 67 sort(p,p+m); 68 sort(q,q+Q); 69 int ans=0,j=0; 70 int qq[maxn]; 71 for(int i=0; i<Q; i++) 72 { 73 while(j<m&&p[j].c<=q[i].l) 74 { 75 ans+=merge1(p[j].a,p[j].b); 76 j++; 77 } 78 qq[q[i].id]=ans; 79 } 80 for(int i=0; i<Q; i++) 81 { 82 printf("%d\n",qq[i]); 83 } 84 } 85 return 0; 86 }