您的位置:首页 > 大数据 > 人工智能

bzoj4152 [AMPPZ2014]The Captain

2016-04-24 21:43 302 查看
  最短路,先将x排序,然后把排序后权值相邻的点连边,再把y排序,也把权值相邻的点连边,求一遍1到n的最短路就好啦。

  代码

#include<cstdio>
#include<queue>
#include<algorithm>
#define mp make_pair
#define fi first
#define sc second
#define N 1000000
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int n,i,dp,p
,pre
,tt
,ww
,flag
;
int dis
;
priority_queue<P,vector<P>,greater<P> > Q;
struct g{
int a,b,id;
}v
;
bool cmp1(g u,g v)
{
return u.a<v.a;
}
bool cmp2(g u,g v)
{
return u.b<v.b;
}

void link(int x,int y,int z)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;ww[dp]=z;
}
long long ans,f
,sum
;
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d%d",&v[i].a,&v[i].b),v[i].id=i;
sort(v+1,v+1+n,cmp1);
for (i=1;i<n;i++)
{
link(v[i].id,v[i+1].id,abs(v[i].a-v[i+1].a));
link(v[i+1].id,v[i].id,abs(v[i].a-v[i+1].a));
}
sort(v+1,v+1+n,cmp2);
for (i=1;i<n;i++)
{
link(v[i].id,v[i+1].id,abs(v[i].b-v[i+1].b));
link(v[i+1].id,v[i].id,abs(v[i].b-v[i+1].b));
}
int inf=1000000000;
for (i=2;i<=n;i++) dis[i]=inf;
Q.push(mp(0,1));

while (!Q.empty())
{
P x=Q.top();Q.pop();
if (x.fi!=dis[x.sc]) continue;
i=p[x.sc];
while (i)
{
if (dis[x.sc]+ww[i]<dis[tt[i]])
{
dis[tt[i]]=dis[x.sc]+ww[i];
Q.push(mp(dis[tt[i]],tt[i]));
}
i=pre[i];
}
}
printf("%d\n",dis
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: