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

 

你可能感兴趣的:(Portal)