HDU_4183_Pahom on Water

来源:互联网 发布:mac刷新dns 编辑:程序博客网 时间:2024/06/06 03:40

问有无从400.0到789.0的无重复点回路。

求400.0和789.0这两个点是否在同一个双连通分量里即可。

Memory:336KTime:0ms#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>using namespace std;const double eps=1e-8;const int N=310;struct Point{double f,x,y,r;}po[310];struct Edge{Edge(int a,int b){u=a,v=b;}int u,v;};int n,a,b;int vis[N],pre[N],bccno[N],num,cnt;vector<int> G[N],bcc[N];stack<Edge> s;int DFS(int u,int fa){int lowu=pre[u]=++num;for(int i=0;i<G[u].size();++i) {int v=G[u][i];Edge e=Edge(u,v);if(!pre[v]) {s.push(e);int lowv=DFS(v,u);lowu=min(lowu,lowv);if(lowv>=pre[u]) {++cnt;bcc[cnt].clear();for(;;) {Edge x=s.top();s.pop();if(bccno[x.u]!=cnt) bccno[x.u]=cnt;if(bccno[x.v]!=cnt) bccno[x.v]=cnt;if(x.u==u&&x.v==v) break;}}}else if(pre[v]<pre[u]&&v!=fa) {s.push(e);lowu=min(lowu,pre[v]);}}return lowu;}void find_bcc(){memset(pre,0,sizeof pre);memset(bccno,0,sizeof bccno);num=cnt=0;for(int i=1;i<=n;++i)if(!pre[i]) DFS(i,-1);}void addedge(int i){    vis[i]=1;    for(int j=1;j<=n;++j) {        if(i==j) continue;        if(sqrt((po[i].x-po[j].x)*(po[i].x-po[j].x)            +(po[i].y-po[j].y)*(po[i].y-po[j].y))>(po[i].r+po[j].r))            continue;        if(fabs(po[j].f-po[i].f)<eps) continue;        if(po[j].f<po[i].f) continue;        G[i].push_back(j);        G[j].push_back(i);        if(!vis[j]) addedge(j);    }}int main(){int _;scanf("%d",&_);while(_--) {scanf("%d",&n);for(int i=1;i<=n;++i) {scanf("%lf%lf%lf%lf",&po[i].f,&po[i].x,&po[i].y,&po[i].r);if(fabs(po[i].f-400)<eps) a=i;else if(fabs(po[i].f-789)<eps) b=i;}for(int i=0;i<=n;++i) G[i].clear();memset(vis,0,sizeof vis);addedge(a);find_bcc();if(bccno[a]==bccno[b]&&bccno[a]!=0) printf("Game is VALID\n");else printf("Game is NOT VALID\n");}}


原创粉丝点击