[CCF CSP]201403-4 无线网络

用了暴力搜索+剪枝,这题说来很迷,感觉没什么方法,就想暴力,但是不太会分析dfs的复杂度,不知道会不会超时,写了一半就搁置了,今天突然把它写完交了一发,得了80分。我觉得可能就是方法问题吧,就先不管了。

结果,想到返回的结果是错误而不是超时,就想是不是计算距离的时候爆longlong了,虽然函数返回值和强制转换都用了longlong,但,万一呢?就把int一股脑换成了longlong交一发就过了hhhh

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;

#define ll long long
ll n,m,k,r,s,ans;
const ll INF=0x3f3f3f3f;
struct Node{
    ll x;
    ll y;
    ll k;
}node[205];

vector<ll> g[205];
ll his[206];

inline ll dis(ll i,ll j)
{
    ll x1=node[i].x,y1=node[i].y;
    ll x2=node[j].x,y2=node[j].y;
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}

void work()
{
    for(ll i=1;i<=s;i++)
    {
        for(ll j=i+1;j<s;j++)
        {
            if(dis(i,j)<=(ll)r*r)
                g[i].push_back(j),
                g[j].push_back(i);
        }
    }
}

void dfs(ll u,ll fa,ll used,ll num)
{
    if(u==2)
    {
        ans=min(ans,num);
        return;
    }
    if(num>=ans) return;
    if(his[u]<=num) return;
    else his[u]=num;
    for(ll i=0;i<g[u].size();i++)
    {
        ll v=g[u][i];
        if(v==fa) continue;
        if(used==k&&node[v].k==1) continue;
        dfs(v,u, node[v].k==1?(used+1):used ,num+1);
    }
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m>>k>>r;
    s=n+m;
    ll x,y;
    for(ll i=1;i<=n;i++)
    {
        cin>>x>>y;
        node[i].x=x;
        node[i].y=y;
        node[i].k=0;
    }
    for(ll i=1;i<=m;i++)
    {
        cin>>x>>y;
        node[n+i].x=x;
        node[n+i].y=y;
        node[n+i].k=1;
    }
    work();//jian tu
    /*for(ll i=1;i<=s;i++)
    {
        for(ll j=0;j<g[i].size();j++)
            if(g[i][j]>i)
                cout<<i<<' '<<g[i][j]<<endl;
    }*/
    ans=INF;
    memset(his,INF,sizeof(his));
    dfs(1,-1,0,1);
    cout<<ans-2<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Andrew-aq/p/12463904.html