[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; }