Member Single Round Match 461 Round 1 - Division I, Level Two BuildingCities

来源:互联网 发布:商品降价提醒功能源码 编辑:程序博客网 时间:2024/06/06 07:16

最短路问题。建图的时候u,v之间建立一条边,并记录为u,v间最少需要修建的城市数。d[i][j]表示当前在第i个点,经过j个新城市的最短路长为多少。只用dp[i][j]<maxTravel的dp[i][j]去更细答案就可以了。

#include <bits/stdc++.h>#define maxn 55using namespace std;const int INF=1e9;int n,w[maxn][maxn];double d[maxn][3000],dis[maxn][maxn];bool done[maxn][3000];struct node{int u,k;double d;node(int _u=0,int _k=0,double _d=0){u=_u;k=_k;d=_d;}bool operator<(const node &rhs)const{return d>rhs.d;}};priority_queue<node>Q;void Dijkstra(int mx){for(int i=0;i<n;i++) for(int j=0;j<3000;j++) d[i][j]=INF;d[0][0]=0;Q.push(node(0,0,0));int u,k;while(!Q.empty()){node now=Q.top();Q.pop();u=now.u;k=now.k;if(done[u][k])continue;if(now.d>mx)continue;done[u][k]=1;for(int i=0;i<n;i++){if(i==u)continue;if(now.d+dis[u][i]>mx)continue;if(d[i][k+w[u][i]]>now.d+dis[u][i]){d[i][k+w[u][i]]=now.d+dis[u][i];Q.push(node(i,k+w[u][i],d[i][k+w[u][i]]));}}}}class BuildingCities{public: int findMinimumCities(int maxDirect, int maxTravel, vector <int> X, vector <int> Y){n=X.size();for(int i=0;i<n;i++)for(int j=0;j<n;j++){dis[i][j]=sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));w[i][j]=ceil(dis[i][j]/maxDirect)-1;w[i][j]=max(w[i][j],0);}Dijkstra(maxTravel);int ans=INF;for(int i=0;i<3000;i++){if(d[n-1][i]<=maxTravel-1e-5){ans=i;break;}}if(ans==INF)ans=-1;return ans;}};


0 0
原创粉丝点击