HDU 4562 守护雅典娜(DAG上的最长路)

理解错题意了。。。写的很麻烦,而且900+卡过。。。

  1 #include <iostream>

  2 #include <cstdio>

  3 #include <cstring>

  4 #include <algorithm>

  5 #include <string>

  6 #include <cmath>

  7 using namespace std;

  8 #define eps 1e-6

  9 struct cir

 10 {

 11     int x,y,r;

 12 } p[1001];

 13 int flag[1001];

 14 int o[1001];

 15 int t1[1001],t2[1001];

 16 struct node

 17 {

 18     int u,v,next;

 19 } edge[1000000];

 20 int X,Y;

 21 int t,first[1001],dp[1001];

 22 void CL()

 23 {

 24     memset(first,-1,sizeof(first));

 25     t = 1;

 26 }

 27 double dis(int x1,int y1,int x2,int y2)

 28 {

 29     return sqrt((x1-x2)*(x1-x2)+(y2-y1)*(y2-y1)+0.0);

 30 }

 31 int judge(int key,int x,int y)

 32 {

 33     double temp;

 34     temp = dis(x,y,p[key].x,p[key].y);

 35     if(temp < p[key].r)

 36         return 1;

 37     else

 38         return 0;

 39 }

 40 int fun(int x,int y)

 41 {

 42     /*B包含A  他们都含有原点 不含有X Y  建边A->B

 43     A包含原点,B含有X Y 且A B不相交  建边A->B

 44     A B 都包含X Y,A包含B   建边 A -> B */

 45     double temp;

 46     temp = dis(p[x].x,p[x].y,p[y].x,p[y].y);

 47     if(temp <= p[x].r + p[y].r &&temp >= fabs(p[x].r-p[y].r*1.0))//相交相切

 48         return 0;

 49     if(t1[x]&&t1[y]&&p[x].r < p[y].r)

 50         return 1;

 51     else if(t1[x]&&t2[y])

 52         return 1;

 53     else if(t2[x]&&t2[y]&&p[x].r > p[y].r)

 54         return 1;

 55     else

 56         return 0;

 57 }

 58 void add(int u,int v)

 59 {

 60     edge[t].u = u;

 61     edge[t].v = v;

 62     edge[t].next = first[u];

 63     first[u] = t ++;

 64 }

 65 int dfs(int u)

 66 {

 67     int ans,i;

 68     if(dp[u] > 0)

 69         return dp[u];

 70     ans = 0;

 71     for(i = first[u]; i != -1; i = edge[i].next)

 72     {

 73         ans = max(dfs(edge[i].v),ans);

 74     }

 75     dp[u] = ans + 1;

 76     return dp[u];

 77 }

 78 int main()

 79 {

 80     int cas,i,j,n,num = 1,ans1;

 81     scanf("%d",&cas);

 82     while(cas--)

 83     {

 84         memset(flag,0,sizeof(flag));

 85         memset(o,0,sizeof(o));

 86         memset(dp,0,sizeof(dp));

 87         CL();

 88         scanf("%d%d%d",&n,&X,&Y);

 89         for(i = 1; i <= n; i ++)

 90         {

 91             scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].r);

 92         }

 93         for(i = 1; i <= n; i ++)

 94         {

 95             t1[i] = judge(i,X,Y);//标记了一下,卡过了。。

 96             t2[i] = judge(i,0,0);

 97             if(t1[i]&&t2[i])

 98                 flag[i] = 1;

 99             else if(!t1[i]&&!t2[i])

100                 flag[i] = 1;

101         }

102         for(i = 1; i <= n; i ++)

103         {

104             if(!flag[i])

105             {

106                 for(j = 1; j <= n; j ++)

107                 {

108                     if(i != j&&!flag[j])

109                     {

110                         if(fun(i,j))

111                         {

112                             add(i,j);

113                             o[j] ++;

114                         }

115                     }

116                 }

117             }

118         }

119         ans1 = 0;

120         for(i = 1; i <= n; i ++)

121         {

122             if(!flag[i]&&o[i] == 0)

123             {

124                 ans1 = max(dfs(i),ans1);

125             }

126         }

127         printf("Case %d: %d\n",num ++,ans1);

128     }

129     return 0;

130 }

 

你可能感兴趣的:(HDU)