1392. Dreaming of Stars

http://acm.timus.ru/problem.aspx?space=1&num=1392

一个森林   每棵树上的节点为一组  然后按照每种顺序输出

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;



const int N=1005;

const int INF=0x3f3f3f3f;

//typedef pair<int,int>point;

int head[N],I;

struct node

{

    int j,next;

}side[N*N*2];

struct point

{

    int x,y,z;

    int r;

}mem[N];

vector<int>vt[N];

bool visited[N];

void add(int i,int j)

{

    side[I].j=j;

    side[I].next=head[i];

    head[i]=I++;

}



bool Reachable(int i,int j)

{

    return sqrt(1.0*(mem[i].x-mem[j].x)*(mem[i].x-mem[j].x)+

    (mem[i].y-mem[j].y)*(mem[i].y-mem[j].y)+

    (mem[i].z-mem[j].z)*(mem[i].z-mem[j].z))<double(mem[i].r+mem[j].r);



    /*

    int d=0,sum=0;

    if(mem[i].x!=mem[j].x)

    {++sum;d=abs(mem[i].x-mem[j].x);}

    if(mem[i].y!=mem[j].y)

    {++sum;d=abs(mem[i].y-mem[j].y);}

    if(mem[i].z!=mem[j].z)

    {++sum;d=abs(mem[i].z-mem[j].z);}

    if(sum>1)

    return false;

    if(d>=mem[i].r+mem[j].r)

    return false;

    return true;

    */

}



void Init(int n)

{

    for(int i=0;i<n;++i)

    {

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

        for(int j=0;j<i;++j)

        {

            if(Reachable(i,j))

            {add(i,j);add(j,i);}

        }

    }

}

void dfs(int x,int k)

{

   visited[x]=true;

   vt[k].push_back(x);

   for(int t=head[x];t!=-1;t=side[t].next)

   {

       int j=side[t].j;

       if(!visited[j])

       {

           dfs(j,k);

       }

   }

}

int main()

{

    //freopen("data.in","r",stdin);

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        memset(head,-1,sizeof(head));

        I=0;

        Init(n);

        memset(visited,false,sizeof(visited));

        for(int i=0;i<n;++i)

        vt[i].clear();

        int m=0;

        for(int i=0;i<n;++i)

        if(!visited[i])

        dfs(i,m++);

        for(int i=0;i<m;++i)

        {

            sort(vt[i].begin(),vt[i].end());

            for(unsigned int j=0;j<vt[i].size();++j)

            {

                if(j>0)

                cout<<", ";

                cout<<vt[i][j];

            }

            cout<<endl;

        }



    }

}

  

你可能感兴趣的:(tar)