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 }

 

posted @ 2013-05-25 22:21  Naix_x  阅读(237)  评论(0编辑  收藏  举报