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 }
View Code

 

posted @ 2015-05-14 23:20  一麻袋码的玛侬  阅读(683)  评论(0编辑  收藏  举报