zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    遗忘
    2008年第一篇1.15
    键盘对应值
    油田开采基础知识
    最近
    oracle中lob数据的操作
    [转]大数据能做什么,大数据和云是不是一回事?
    [转]从这些方面判断一家公司的好坏
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    谈创新
  • 原文地址:https://www.cnblogs.com/Andrew-aq/p/12463904.html
Copyright © 2011-2022 走看看