当前位置:Gxlcms > 数据库问题 > POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks

POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks

时间:2021-07-01 10:21:17 帮助过:8人阅读

#include <algorithm> 2 #include <cstdio> 3 #include <queue> 4 5 using namespace std; 6 7 const int INF(0x3f3f3f3f); 8 const int N(5000+105); 9 const int M(200000+5); 10 11 int hed[N],had[N],sumedge; 12 struct Edge 13 { 14 int v,next,w; 15 }edge1[M],edge2[M]; 16 inline void ins(int u,int v,int w) 17 { 18 edge1[++sumedge].v=v; 19 edge1[sumedge].next=hed[u]; 20 edge1[sumedge].w=w; 21 hed[u]=sumedge; 22 edge2[sumedge].v=u; 23 edge2[sumedge].next=had[v]; 24 edge2[sumedge].w=w; 25 had[v]=sumedge; 26 27 edge1[++sumedge].v=u; 28 edge1[sumedge].next=hed[v]; 29 edge1[sumedge].w=w; 30 hed[v]=sumedge; 31 edge2[sumedge].v=v; 32 edge2[sumedge].next=had[u]; 33 edge2[sumedge].w=w; 34 had[u]=sumedge; 35 } 36 37 int dis[N]; 38 bool inq[N]; 39 void SPFA(int s) 40 { 41 for(int i=1;i<s;i++) dis[i]=INF; 42 dis[s]=0; inq[s]=1; 43 queue<int>que; que.push(s); 44 for(int u,v;!que.empty();) 45 { 46 u=que.front(); que.pop(); inq[u]=0; 47 for(int i=had[u];i;i=edge2[i].next) 48 { 49 v=edge2[i].v; 50 if(dis[v]>dis[u]+edge2[i].w) 51 { 52 dis[v]=dis[u]+edge2[i].w; 53 if(!inq[v]) que.push(v),inq[v]=1; 54 } 55 } 56 } 57 } 58 59 struct Node 60 { 61 int now,g; 62 bool operator < (Node a) const 63 { 64 return a.g+dis[a.now]<g+dis[now]; 65 } 66 }; 67 int Astar(int s,int t,int k) 68 { 69 priority_queue<Node>que; 70 int cnt=0; Node u,v; 71 u.g=0; u.now=s; 72 que.push(u); 73 for(;!que.empty();) 74 { 75 u=que.top(); que.pop(); 76 if(u.now==t) cnt++; 77 if(cnt==k) return u.g; 78 for(int i=hed[u.now];i;i=edge1[i].next) 79 { 80 v.now=edge1[i].v; 81 v.g=u.g+edge1[i].w; 82 que.push(v); 83 } 84 } 85 return 0; 86 } 87 88 inline void read(int &x) 89 { 90 x=0; register char ch=getchar(); 91 for(;ch>9||ch<0;) ch=getchar(); 92 for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0; 93 } 94 95 int AC() 96 { 97 // freopen("block.in","r",stdin); 98 // freopen("block.out","w",stdout); 99 100 int n,m; read(n),read(m); 101 for(int v,u,w;m--;) 102 read(u),read(v),read(w),ins(u,v,w); 103 SPFA(n); printf("%d\n",Astar(1,n,2)); 104 return 0; 105 } 106 107 int I_want_AC=AC(); 108 int main(){;} Astar AC

 

次短路正经做法:

SPFA跑出从1到i和从n到i的dis,枚举每条不在最短路上的边,更新ans

技术分享
 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <queue>
 4 
 5 using namespace std;
 6 
 7 const int INF(0x3f3f3f3f);
 8 const int N(5000+105);
 9 const int M(100000+5);
10 
11 int m,n,head[N],sumedge;
12 struct Edge
13 {
14     int v,next,w;
15     Edge(int v=0,int next=0,int w=0):
16         v(v),next(next),w(w){}
17 }edge[M<<1];
18 inline void ins(int u,int v,int w)
19 {
20     edge[++sumedge]=Edge(v,head[u],w);
21     head[u]=sumedge;
22 }
23 
24 bool inq[N];
25 int d1[N],d2[N];
26 inline void SPFA(int s,int *dis)
27 {
28     for(int i=1;i<=n;i++)
29         inq[i]=0,dis[i]=INF;
30     dis[s]=0; inq[s]=1;
31     queue<int>que; que.push(s);
32     for(int u,v;!que.empty();)
33     {
34         u=que.front(); que.pop(); inq[u]=0;
35         for(int i=head[u];i;i=edge[i].next)
36         {
37             v=edge[i].v;
38             if(dis[v]>dis[u]+edge[i].w)
39             {
40                 dis[v]=dis[u]+edge[i].w;
41                 if(!inq[v]) que.push(v),inq[v]=1;
42             }
43         }
44     }
45 }
46 
47 inline void read(int &x)
48 {
49     x=0; register char ch=getchar();
50     for(;ch>9||ch<0;) ch=getchar();
51     for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0;
52 }
53 
54 int AC()
55 {
56     freopen("block.in","r",stdin);
57     freopen("block.out","w",stdout);
58 
59     read(n),read(m);
60     for(int v,u,w;m--;ins(u,v,w),ins(v,u,w))
61         read(u),read(v),read(w);
62     SPFA(1,d1); SPFA(n,d2);
63     int ans=INF,tmp;
64     for(int i,v,u=1;u<=n;u++)
65     {
66         for(int i=head[u];i;i=edge[i].next)
67         {
68             v=edge[i].v;
69             tmp=d1[u]+d2[v]+edge[i].w;
70             if(tmp>d1[n]&&ans>tmp) ans=tmp;
71         }
72     }
73     printf("%d\n",ans);
74     return 0;
75 }
76 
77 int I_want_AC=AC();
78 int main(){;}
SPFA 跑次短路

 

POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks

标签:stdout   nod   const   section   targe   block   nat   open   input   

人气教程排行