聽聽1聽/*聽
聽聽2聽聽*聽SOUR:zju2589
聽聽3聽聽*聽ALGO:computational聽geomtry聽璁$畻騫抽潰涓婁笉閲嶅悎鐨刵涓渾褰㈡垚鐨勫尯鍩?br />聽聽4聽聽*聽鍩烘湰鐨勬柟娉曪紝濡傚浘鎵紺猴紝灝嗘墍鏈夊渾涔嬮棿鐨勪氦鐐逛綔涓虹偣錛屽皢鍦ㄥ悓涓涓渾涓婄殑鎵鏈変氦鐐逛箣闂寸殑寮т綔
聽聽5聽聽*聽涓鴻竟寤虹珛涓寮犳湁鍚戝浘錛屼箣鍚庡彲浠ュ埄鐢ㄥ鉤闈㈠浘鐨勬鎷夊畾鐞?br />聽聽6聽聽*聽聽聽聽聽聽聽聽聽聽聽V聽-聽E聽+聽F聽=聽2
聽聽7聽聽*聽鐢變簬V宸茬煡錛孍宸茬煡錛孎灝卞彲浠ユ眰鍑烘潵浜嗐?br />聽聽8聽聽*聽鐢變簬嬈ф媺瀹氱悊鏄涓寮犳棤鍚戣繛閫氬浘鎴愮珛鐨勶紝濡傛灉鍥炬湁澶氫釜榪為氬潡鐨勬椂鍊欓渶瑕佸嬈ф媺瀹氱悊鍋氫竴浜?br />聽聽9聽聽*聽淇敼銆傜敱浜庡涓湁鍚戝浘鐨勯潰鍏變韓鏈澶栬竟鐨勯潰錛屾墍浠ヨ鑱旈氬潡鐨勪釜鏁頒負n
聽10聽聽*聽V聽-聽E聽+聽F聽=聽2聽*聽n聽,聽浣嗘槸闇瑕佸噺鍘籲涓仈閫氬潡鍏變韓鐨勬渶澶у鉤闈?br />聽11聽聽*聽鎵浠ヂ燜聽=聽n聽+聽1聽+聽E聽-聽V;
聽12聽聽*聽DATE:聽2010騫綽?7鏈埪?8鏃ヂ犳槦鏈熷洓聽14:49:41聽CST
聽13聽聽*聽COMM:5
聽14聽聽*聽*/
聽15聽const聽int聽N聽=聽64;
聽16聽const聽double聽eps聽=聽1e-8;
聽17聽int聽n,聽vis[N],聽g[N][N];
聽18聽double聽r[N];
聽19聽struct聽point_t聽{
聽20聽聽聽聽聽double聽x,聽y;
聽21聽聽聽聽聽point_t(){}
聽22聽聽聽聽聽point_t(double聽a,聽double聽b){x聽=聽a,聽y聽=聽b;}聽
聽23聽}c[N];
聽24聽
聽25聽int聽dcmp(double聽x)聽{聽return聽(x聽>聽eps)聽-聽(x聽<聽-eps);}聽
聽26聽bool聽operator聽<聽(point_t聽a,point_t聽b)聽
聽27聽{
聽28聽聽聽if聽(dcmp(a.x聽-聽b.x))聽{
聽29聽聽聽聽聽聽聽return聽a.x聽<聽b.x;
聽30聽聽聽}
聽31聽聽聽return聽dcmp(a.y聽-聽b.y)聽<聽0;
聽32聽}
聽33聽
聽34聽point_t聽operator聽+聽(point_t聽a,聽point_t聽b)聽{聽return聽point_t(a.x+b.x,聽a.y+b.y);}
聽35聽point_t聽operator聽-聽(point_t聽a,聽point_t聽b)聽{聽return聽point_t(a.x-b.x,聽a.y-b.y);}
聽36聽double聽dist(point_t聽a,聽point_t聽b)聽{聽return聽hypot(a.x-b.x,聽a.y-b.y);}
聽37聽double聽sqr(double聽x)聽{聽return聽x聽*聽x;}
聽38聽point_t聽normal(point_t聽a)聽{聽return聽point_t(a.x聽/聽hypot(a.x,聽a.y),聽a.y聽/聽hypot(a.x,聽a.y));}
聽39聽point_t聽scale(point_t聽a,聽double聽fac)聽{聽return聽point_t(a.x聽*聽fac,聽a.y聽*聽fac);}
聽40聽bool聽intersect(point_t聽c1,聽double聽r1,聽point_t聽c2,聽double聽r2,聽point_t聽&a,聽point_t聽&b)
聽41聽{
聽42聽聽聽double聽d聽=聽dist(c1,聽c2);
聽43聽聽聽if聽(d聽<聽fabs(r1聽-聽r2)聽-聽eps聽||聽d聽>聽r1聽+聽r2聽+聽eps)聽{
聽44聽聽聽聽聽聽聽return聽false;
聽45聽聽聽}
聽46聽聽聽double聽len聽=聽(sqr(r1)聽-聽sqr(r2)聽+聽sqr(d))聽/聽2.0聽/聽d;
聽47聽聽聽double聽h聽=聽sqrt(sqr(r1)聽-聽sqr(len));
聽48聽聽聽point_t聽t聽=聽normal(c2聽-聽c1);
聽49聽聽聽point_t聽p聽=聽c1聽+聽scale(t,聽len);
聽50聽聽聽point_t聽v聽=聽scale(point_t(-t.y,聽t.x),聽h);
聽51聽聽聽a聽=聽p聽+聽v,聽b聽=聽p聽-v;
聽52聽聽聽return聽true;
聽53聽}
聽54聽
聽55聽void聽init()
聽56聽{
聽57聽聽聽int聽i;
聽58聽聽聽memset(g,聽0,聽sizeof(g));
聽59聽聽聽memset(vis,聽0,聽sizeof(vis));
聽60聽聽聽for聽(i聽=聽0;i聽<聽n;i++)聽{
聽61聽聽聽聽聽聽聽g[i][i]聽=聽1;
聽62聽聽聽}
聽63聽}
聽64聽
聽65聽int聽main()
聽66聽{
聽67聽聽聽int聽testcase,聽i,聽j,聽k;
聽68聽聽聽scanf("%d",聽&testcase);
聽69聽聽聽while聽(testcase--)聽{
聽70聽聽聽聽聽聽聽scanf("%d",聽&n);
聽71聽聽聽聽聽聽聽set聽<point_t>聽allpoint,聽p[64];
聽72聽聽聽聽聽聽聽for聽(i聽=聽0;i聽<聽n;i++)聽{
聽73聽聽聽聽聽聽聽聽聽聽聽scanf("%lf聽%lf聽%lf",聽&c[i].x,聽&c[i].y,聽&r[i]);
聽74聽聽聽聽聽聽聽}
聽75聽聽聽聽聽聽聽init();
聽76聽聽聽聽聽聽聽for聽(i聽=聽0;i聽<聽n;i++)聽{
聽77聽聽聽聽聽聽聽聽聽聽聽for聽(j聽=聽i聽+聽1;j聽<聽n;j++)聽{
聽78聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽point_t聽a,聽b;
聽79聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(intersect(c[i],聽r[i],聽c[j],聽r[j],聽a,聽b))聽{
聽80聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽allpoint.insert(a),聽allpoint.insert(b);
聽81聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽p[i].insert(a),聽p[i].insert(b);
聽82聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽p[j].insert(a),聽p[j].insert(b);
聽83聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽g[i][j]聽=聽g[j][i]聽=聽1;
聽84聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
聽85聽聽聽聽聽聽聽聽聽聽聽}
聽86聽聽聽聽聽聽聽}
聽87聽聽聽聽聽聽聽for聽(k聽=聽0;k聽<聽n;k++)聽{
聽88聽聽聽聽聽聽聽聽聽聽聽for聽(i聽=聽0;i聽<聽n;i++)聽{
聽89聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽for聽(j聽=聽0;j聽<聽n;j++)聽{
聽90聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽g[i][j]聽|=聽g[i][k]聽&聽g[k][j];
聽91聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
聽92聽聽聽聽聽聽聽聽聽聽聽}
聽93聽聽聽聽聽聽聽}
聽94聽聽聽聽聽聽聽int聽f聽=聽1;
聽95聽聽聽聽聽聽聽for聽(i聽=聽0;i聽<聽n;i++)聽{
聽96聽聽聽聽聽聽聽聽聽聽聽f聽+=聽p[i].size();
聽97聽聽聽聽聽聽聽聽聽聽聽if聽(!vis[i])聽{
聽98聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽f聽+=聽1;
聽99聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽for聽(j聽=聽0;j聽<聽n;j++)聽{
100聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽vis[j]聽|=聽g[i][j];
101聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
102聽聽聽聽聽聽聽聽聽聽聽}
103聽聽聽聽聽聽聽}
104聽聽聽聽聽聽聽f聽-=聽allpoint.size();
105聽聽聽聽聽聽聽printf("%d\n",聽f);
106聽聽聽}聽
107聽聽聽return聽0;
108聽}
109聽
110聽

]]>