您的位置:首页 > 其它

hdu 4849 Wow! Such City! 简单最短路

2015-05-20 19:31 417 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4849

理解题意,然后根据公式求出距离

再套用最短路模板即可

队友写的~

#include <cstring>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
#include <queue>

using namespace std;

typedef long long ll;
typedef pair<ll, int> P;
#define INF 0x3f3f3f3f
const double eps = 1e-9;
const int maxn = 1000;
const int modx = 5837501;
const int mody = 9860381;
const int modz = 8475871;
ll x[maxn*maxn+10], y[maxn*maxn+10];
ll z[maxn*maxn+10];

void build(int n, ll x0, ll x1, ll y0, ll y1)
{
int N = n*n;
x[0] = x0; y[0] = y0;
x[1] = x1; y[1] = y1;
for(int i = 2; i < N; i++)
{
x[i] = (12345 + x[i-1]*23456 + x[i-2]*34567 + (x[i-1]*x[i-2]%modx)*45678)%modx;
y[i] = (56789 + y[i-1]*67890 + y[i-2]*78901 + (y[i-1]*y[i-2]%mody)*89012)%mody;
}
for(int i = 0; i < N; i++)
z[i] = (x[i]*90123 + y[i]) % modz + 1;
//cout<<endl;
}
ll d[maxn+10];

void Dijkstra(int n)
{
priority_queue<P, vector<P>, greater<P> > que;
fill(d, d+n+1, INF);
d[0] = 0;
que.push(make_pair(d[0], 0));
while(!que.empty())
{
P tp = que.top();que.pop();
int u = tp.second;
if(d[u] < tp.first)
continue;
for(int v = 0; v < n; v++)
{
if(v == u)    continue;
ll dis = z[u*n+v];
if(d[v] > d[u] + dis)
{
d[v] = d[u]+ dis;
que.push(make_pair(d[v], v));
}
}
}
}
int main()
{
int n,m,x0,x1,y0,y1;
//freopen("in", "r", stdin);
while(scanf("%d%d%d%d%d%d", &n, &m, &x0, &x1, &y0, &y1) != EOF)
{
build(n,(ll)x0,(ll)x1,(ll)y0,(ll)y1);
Dijkstra(n);
ll ans = m;
for(int i = 1; i < n; i++)
ans = min(ans, d[i]%m);
printf("%I64d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: