Single Round Match 573 Round 1 - Division I, Level Two SkiResorts

这种题目一般就是d[i][j]当前在第i个点,高度为j,最小代价是多少。但是本题中直接用j的话会非常大,有1e9。但是我们发现在最优的情况下,我们取到的j必然是题目中给出的高度。所以直接把题目中给的距离散化就可以了。这样状态数就是n^2。TC的问题一般n都是50,所以就可以了。

#include 
#define maxn 109
using namespace std;
const long long INF=1e18;
vectorG[maxn],mp,X;
int n,m;
long long d[maxn][maxn],wi[maxn];
bool inq[maxn][maxn];
long long spfa()
{
	queue >Q;
	for(int i=0;i pii=Q.front();
		Q.pop();
		int u=pii.first,s=pii.second;
		inq[u][s]=0;
		for(int i=0;i<(int)G[u].size();i++)
		{
			int v=G[u][i];
			for(int j=0;j<=s;j++)
			{
				if(d[v][j]>d[u][s]+abs(wi[v]-X[j]))
				{
					d[v][j]=d[u][s]+abs(wi[v]-X[j]);
					if(!inq[v][j])
					{
						inq[v][j]=1;
						Q.push(make_pair(v,j));
					}
				}
			}
		}
	}
	for(int j=0;j road, vector  h)
	{
		n=road.size();
		for(int i=0;i=INF)
			ans=-1;
		return ans;
	}
};


你可能感兴趣的:(图论,Graph,algorithm,topcoder)