hdu 3938 Portal

http://acm.hdu.edu.cn/showproblem.php?pid=3938

这道题一开始没看懂题意,看了别人的博客之后才理解题意。用的是离线的并查集,输入完之后再处理。问的是在小于等于L的路径数。

 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 }
View Code

 

posted @ 2014-05-18 19:51  null1019  阅读(189)  评论(0编辑  收藏  举报