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 }