首页 > 代码库 > 【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线
【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线
建立k+1张图,
在图与图之间,若在原图中x到y有边,就建立从 第i层的x 到 i+1层的y 建边,权值为0。代表一次免费机会。
由于一旦到了第i+1层的图里,则无法回到之前的层,所以免费最多只有k次。符合题意。
spfa会TLE。
1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,m,k,sta,end,x,y,z,ans=2147483647; 7 struct Point{int d,u;Point(const int &a,const int &b){d=a;u=b;}Point(){}}; 8 bool operator < (const Point &a,const Point &b){return a.d>b.d;} 9 priority_queue<Point>q;10 bool vis[110001];11 int d[110001],first[2100001],next[2100001],v[2100001],w[2100001],en;12 void AddEdge(const int &U,const int &V,const int &W)13 {v[++en]=V; w[en]=W; next[en]=first[U]; first[U]=en;}14 void dijkstra(const int &s)15 {16 memset(vis,false,sizeof(vis));17 memset(d,0x7f,sizeof(d)); d[s]=0;18 q.push(Point(0,s));19 while(!q.empty())20 {21 Point x=q.top(); q.pop();22 if(!vis[x.u])23 {24 vis[x.u]=true;25 for(int i=first[x.u];i;i=next[i])26 if(d[v[i]]>d[x.u]+w[i])27 {28 d[v[i]]=d[x.u]+w[i];29 q.push(Point(d[v[i]],v[i]));30 }31 }32 }33 }34 int main()35 {36 scanf("%d%d%d%d%d",&n,&m,&k,&sta,&end);37 for(int i=1;i<=m;i++)38 {39 scanf("%d%d%d",&x,&y,&z);40 AddEdge(x,y,z);41 AddEdge(y,x,z);42 for(int j=1;j<=k;j++)43 {44 AddEdge(x+(j-1)*n,y+j*n,0);45 AddEdge(y+(j-1)*n,x+j*n,0);46 AddEdge(x+j*n,y+j*n,z);47 AddEdge(y+j*n,x+j*n,z);48 }49 }50 dijkstra(sta);51 for(int i=0;i<=k;i++) ans=min(ans,d[end+i*n]);52 printf("%d\n",ans);53 return 0;54 }
【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。