UVA 12661(动态权值+最短路,dij)
题意:赛车背景,给你n个节点,m条边的图以及起点和终点;其中每条边的信息包括u(起点),v(终点),a(开启的时间),b(关闭的时间),d(通过这条道路的时间);求最短通过的时间,其中车在进的时候,保证时间足够能走出去;否则需要等一些分钟;
思路:dij真是万能的,把固定权值改成动态的即可;
其中改变权值的语句很关键,并且推出的规律有个前提就是保证道路打开的时间一定大于等于通过该条道路的时间,否则相当于道路不通,被我忽略了,WA了3遍,可惜;
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <sstream> 6 #include <queue> 7 #include <vector> 8 #define repu(i,a,b) for(int i=a;i<b;i++) 9 using namespace std; 10 #define N 330 11 int v[N],t[N]; 12 const int maxn=2200; 13 const int INF=0x3f3f3f3f; 14 int rode[maxn]; 15 int c[N][N],p[N][N]; 16 int st = 0,ed,k; 17 struct Edge 18 { 19 int u,v,t1,t2,d; 20 Edge(int u, int v, int t1,int t2, int d):u(u),v(v),t1(t1),t2(t2),d(d) {} 21 }; 22 struct qnode 23 { 24 int u; 25 int d; 26 qnode(int u, int d):u(u), d(d) {} 27 bool operator < (const qnode a)const 28 { 29 return d > a.d; 30 } 31 }; 32 33 int GetDist(int t, Edge e) 34 { 35 t %= (e.t1 + e.t2); 36 if(e.d <= e.t1)///坑,一开始没加上 37 { 38 if(t >= e.t1 || e.t1 - t < e.d) 39 return e.t1 +e.t2 -t+e.d; 40 else if(e.d + t <= e.t1) 41 return e.d; 42 } 43 return INF; 44 } 45 struct Dijkstra 46 { 47 int n; 48 vector<int> G[maxn]; 49 vector<Edge> edge; 50 int d[maxn]; 51 bool vis[maxn]; 52 void init(int n) 53 { 54 this->n=n; 55 for(int i=0; i<=n; i++) 56 { 57 G[i].clear(); 58 vis[i]=0; 59 d[i]=INF; 60 } 61 edge.clear(); 62 } 63 void AddEdge(int u, int v,int c,int e, int f) 64 { 65 G[u].push_back(edge.size()); 66 edge.push_back(Edge(u,v,c,e,f)); 67 } 68 int dijkstra(int st,int ed) 69 { 70 int sum = 0; 71 memset(vis, 0, sizeof vis); 72 repu(i,1,n+1) 73 d[i] = INF; 74 priority_queue<qnode> q; 75 d[st]=0; 76 q.push(qnode(st, 0)); 77 while(!q.empty()) 78 { 79 qnode x=q.top(); 80 q.pop(); 81 if(vis[x.u]) 82 continue ; 83 vis[x.u]=true; 84 if(x.u == ed) 85 return d[ed]; 86 for(int i=0; i<G[x.u].size(); i++) 87 { 88 Edge& e=edge[G[x.u][i]]; 89 int vv = GetDist(d[x.u], e);///推这时候的权值 90 int tmp=d[x.u]+vv;///过这条边需要的时间 91 if(d[e.v] > tmp) 92 { 93 d[e.v]=tmp; 94 q.push(qnode(e.v, d[e.v])); 95 } 96 /// if(d[e.v] > d[x.u]+e.d)///原句 97 /// { 98 /// d[e.v]=d[x.u]+e.d; 99 /// q.push(qnode(e.v, d[e.v])); 100 /// } 101 } 102 } 103 return d[ed]; 104 } 105 } dij; 106 int main() 107 { 108 int n,m,kase =1; 109 while(~scanf("%d%d%d%d",&m,&n,&st,&ed)) 110 { 111 dij.init(m); 112 memset(t,0,sizeof(t)); 113 int a,b,f,c,e; 114 repu(i,0,n) 115 { 116 scanf("%d%d%d%d%d",&a,&b,&c,&e,&f); 117 dij.AddEdge(a,b,c,e,f); 118 } 119 dij.dijkstra(st,ed); 120 printf("Case %d: %d\n",kase++,dij.d[ed]); 121 } 122 return 0; 123 }
人生就像心电图,想要一帆风顺,除非game-over