HDU 4435 charge-station(天津现场赛)

比赛的时候没有做出来,没有想到解法啊,,回来之后。侯哥提醒一下。明白了。。Orz。。。


#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n,d;
const int N = 159;
struct cpoint{
    int x,y;
    void get()
    {
        scanf("%d%d",&x,&y);
    }
} re[N];
int getdis(int i,int j)
{
    int t = (re[i].x-re[j].x)*(re[i].x-re[j].x)+(re[i].y-re[j].y)*(re[i].y-re[j].y);
    int k = (int)(sqrt(t*1.0));
    if(k*k==t) return k;
    return k+1;
}
int dis[N][N];
bool ans[N];
queue<int> que;
bool v[N];
bool ok()
{
    memset(v,0,sizeof(v));
    while(!que.empty()) que.pop();
    que.push(0);
    v[0] = true;
    while(!que.empty())
    {
        int e = que.front();que.pop();
        for(int i=1;i<n;i++)
        if(!v[i]&&ans[i]&&dis[e][i]<=d)
        {
            v[i] =true;
            que.push(i);
        }else if(!v[i]&&dis[e][i]<=(d>>1))
        {
            v[i] = true;
            //que.push(i);
        }
    }
    for(int i=0;i<n;i++)
    if(!v[i]) return false;
    return true;
}
void solve()
{
    memset(ans,true,sizeof(ans));
    if(!ok())
    {
        printf("-1\n"); return ;
    }
    for(int i=n-1;i>0;i--)
    {
        ans[i] = 0;
        if(!ok())
        {
            ans[i] = 1;
        }
    }
    int tmp[N],cnt=0,f=0;
    for(int i=n-1;i>=0;i--)
    {
        if(ans[i]) tmp[cnt++] = 1,f=1;
        else if(f) tmp[cnt++] = 0;
    }
    for(int i=0;i<cnt;i++)
    printf("%d",tmp[i]);
    printf("\n");
}
int main()
{
    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&d))
    {
        for(int i=0;i<n;i++) re[i].get();
        for(int i=0;i<n;i++)
        {
            dis[i][i] = 0;
            for(int j=i+1;j<n;j++)
            dis[i][j] = dis[j][i] = getdis(i,j);
        }
        solve();
    }
    return 0;
}


你可能感兴趣的:(HDU 4435 charge-station(天津现场赛))