【最短路】【Heap-Dijkstra】【分层图】bzoj2662 [BeiJing wc2012]冻结

裸的分层图最短路。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 51
 7 #define K 51
 8 #define M 2001
 9 struct Point{int u,d;Point(const int &a,const int &b){d=a;u=b;}Point(){}};
10 bool operator < (const Point &a,const Point &b){return a.d>b.d;}
11 priority_queue<Point>q;
12 int n,m,k,dis[N*K],ans=2147483647;
13 bool vis[N*K];
14 int first[M*K*2],next[M*K*2],v[M*K*2],w[M*K*2],en,x,y,z;
15 void AddEdge(const int &U,const int &V,const int &W)
16 {
17     v[++en]=V;
18     w[en]=W;
19     next[en]=first[U];
20     first[U]=en;
21 }
22 void dijkstra(const int &s)
23 {
24     memset(dis,0x7f,sizeof(dis));
25     dis[s]=0; q.push(Point(0,s));
26     while(!q.empty())
27       {
28         Point x=q.top(); q.pop();
29         if(!vis[x.u])
30           {
31             vis[x.u]=0;
32             for(int i=first[x.u];i;i=next[i])
33               if(dis[v[i]]>dis[x.u]+w[i])
34                 {
35                   dis[v[i]]=dis[x.u]+w[i];
36                   q.push(Point(dis[v[i]],v[i]));
37                 }
38           }
39       }
40     for(int i=0;i<=k;i++) ans=min(ans,dis[n+i*n]);
41     printf("%d\n",ans);
42 }
43 int main()
44 {
45     scanf("%d%d%d",&n,&m,&k);
46     for(int i=1;i<=m;i++)
47       {
48         scanf("%d%d%d",&x,&y,&z);
49         AddEdge(x,y,z); AddEdge(y,x,z);
50         for(int j=1;j<=k;j++)
51           {
52             AddEdge(x+j*n,y+j*n,z);
53             AddEdge(y+j*n,x+j*n,z);
54             AddEdge(x+(j-1)*n,y+j*n,z>>1);
55             AddEdge(y+(j-1)*n,x+j*n,z>>1);
56           }
57       }
58     dijkstra(1);
59     return 0;
60 }
时间: 2024-11-18 02:15:43

【最短路】【Heap-Dijkstra】【分层图】bzoj2662 [BeiJing wc2012]冻结的相关文章

分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结

2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 999  Solved: 535[Submit][Status][Discuss] Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中??" 在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符 卡

bzoj2662 [BeiJing wc2012]冻结

2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 541[Submit][Status][Discuss] Description "我要成为魔法少女!"     "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中??"        在这个愿望被实现以后的世界里,人们享受着魔法卡片(Spe

bzoj2662: [BeiJing wc2012]冻结 最短路 建图

好久没有1A题啦?(^?^*) 一个sb建图,我居然调样例调了10min 看起来是双向边,其实在建图的时候要当成有向图, 否则他会时间倒流(233) 把每个点裂成k个点,然后把每条边裂成4条边(正向反向&膜不膜) (话说我好像不会用openlivewriter贴代码,尴尬了) 1 #include <bits/stdc++.h> 2 #define poi(x,y) ((x)*(k+1)+(y)) 3 #define st poi(1,0) 4 #define INF 20000000

BZOJ2662[BeiJing wc2012]冻结【SPFA】

“我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”        在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷.  现在,不需要立下契约也可以使用魔法了!你还不来试一试?   比如,我们在魔法百科全书(Encyclopedia  of  Spells)里用“freeze”作为关键字来查询,会有很多有趣的结果. 例如,我们熟知的Cirno,她的冰冻魔法当然会有对应的 SpellCard

BZOJ 2662: [BeiJing wc2012]冻结(最短路)

这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. -------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #inclu

BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”        在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符 卡)带来的便捷.   现在,不需要立下契约也可以使用魔法了!你还不来试一试?   比如,我们在魔法百科全书(Encyclopedia  of  Spells)里用“freeze”作为关 键字来查询,会有很多有趣的结果. 例如,我们熟知的Cirno,她的冰冻魔

bzoj2662:[BeiJing wc2012]冻结

题目描述 "我要成为魔法少女!"     "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中??"        在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷.  现在,不需要立下契约也可以使用魔法了!你还不来试一试?   比如,我们在魔法百科全书(Encyclopedia  of  Spells)里用"freeze"作为关键字来查询,会有很多有

[POJ3463] Sightseeing(次短路 Heap + Dijkstra)

传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示起点到x的最短路条数.tot[x][1]表示起点到x的次短路的条数: vis[x][2]对应于x和0.1功能为记录该点是否被访问! 那么如何更新最小和次小路呢?显然我们容易想到下面的方法: 1.if(x<最小)更新最小,次小:2.else if(x==最小)更新方法数:3.else if(x<次小

[P4568][JLOI2011] 飞行路线 (分层图+最短路)

题意:有n个城市,m条航线,每条航线都有一个权值,并且还多了k次免费航行的机会,求1~n的最短路: 做法:分层图+最短路: 1.分层图:因为多了k次免费航行,所以可以考虑建出k+1个图,然后跑一遍最短路: 2.最短路:既然能写分层图,那么最短路应该都会了吧,可以用 dijkstra 或 SPFA : 附上代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>