黑书 双调路径

http://acm.cs.ecnu.edu.cn/problem.php?problemid=1468

解题报告:http://www.cnblogs.com/blackcruiser/articles/1997097.html

View Code
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<queue>
  7 #include<stack>
  8 #include<string>
  9 #include<vector>
 10 #include<cstdlib>
 11 #include<map>
 12 #include<set>
 13 using namespace std;
 14 #define CL(x,v) memset(x,v,sizeof(x));
 15 #define R(i,st,en) for(int i=st;i<en;++i)
 16 #define LL long long
 17 #define inf 0x3f3f3f3f
 18  
 19 const int maxn = 101;
 20 const int maxm = 1000;
 21 int n,m,st,en;
 22 struct edge
 23 {
 24     int v,c,t;
 25     edge(){}
 26     edge(int v, int c, int t):v(v), c(c), t(t){}
 27 };
 28 vector <edge> adj[maxn];
 29 int dis[maxn][maxn * 100 + 1];
 30 bool vis[maxn][maxn * 100 + 1];
 31 int minc[maxn],MAX_C;
 32 struct node
 33 {
 34     int u,c,t;
 35     bool operator < (const node & oth) const
 36     {
 37         return t > oth.t;
 38     }
 39     node(){}
 40     node(int u, int c, int t):u(u), c(c), t(t){}
 41 };
 42 int dij()
 43 {
 44     priority_queue <node> q;
 45     dis[st][0] = 0;
 46     q.push(node(st, 0, 0));
 47     while (!q.empty())
 48     {
 49         node cur = q.top();
 50         q.pop();
 51         if(vis[cur.u][cur.c]) continue;
 52         vis[cur.u][cur.c] = 1;
 53         if(minc[cur.u] < cur.c) continue;
 54         minc[cur.u] = cur.c;
 55         for (int i = 0; i < adj[cur.u].size(); ++i)
 56         {
 57             node nt;
 58             nt.u = adj[cur.u][i].v;
 59             nt.t = cur.t + adj[cur.u][i].t;
 60             nt.c = cur.c + adj[cur.u][i].c;
 61             if (nt.c <= MAX_C && nt.t < dis[nt.u][nt.c])
 62             {
 63                 dis[nt.u][nt.c] = nt.t;
 64                 q.push(nt);
 65             }
 66         }
 67     }
 68     int tmp = 0, min_t = inf;
 69     for (int i = 0; i<= MAX_C; ++i)
 70         if (dis[en][i] < inf && min_t > dis[en][i])
 71         {
 72             tmp++;
 73             min_t = dis[en][i];
 74         }
 75     return tmp;
 76 }
 77 void init()
 78 {
 79     memset(vis, 0, sizeof(vis));
 80     memset(dis, 0x3f, sizeof(dis));
 81     memset(minc, 0x3f, sizeof(minc));
 82     MAX_C =  (n - 1) * 100;
 83     memset(adj, 0, sizeof(adj));
 84 }
 85 int main()
 86 {
 87     while(~scanf("%d%d%d%d", &n, &m, &st, &en))
 88     {
 89         init();
 90         for (int i = 0; i < m; ++i)
 91         {
 92             int u, v, c, t;
 93             scanf("%d%d%d%d", &u, &v, &c, &t);
 94             adj[u].push_back(edge(v, c, t));
 95             adj[v].push_back(edge(u, c, t));
 96         }
 97         int ans = dij();
 98         printf("%d\n",ans);
 99     }
100     return 0;
101 }

 

posted @ 2013-04-06 16:07  Missa  阅读(186)  评论(0编辑  收藏  举报