CF843D Dynamic Shortest Path

标程:

 1 #include<bits/stdc++.h>
 2 #define P pair<ll,int>
 3 using namespace std;
 4 int read()
 5 {
 6    int x=0,f=1;char ch=getchar();
 7    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
 8    while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 9    return x*f;
10 }
11 const int N=200005;
12 typedef long long ll;
13 const ll inf=1ll<<60;
14 priority_queue<P,vector<P>,greater<P> >Q;
15 struct node{int to,next;}num[N];
16 struct _node{int u,v,w;}e[N];
17 int cnt,head[N],n,m,qq,vis[N],len,u,v,tmp;
18 ll dis[N],d[N],x;
19 queue<int> q[N];
20 void add(int x,int i) {num[++cnt].next=head[x];num[cnt].to=i;head[x]=cnt;}
21 void dij()
22 {
23     for (int i=2;i<=n;i++) dis[i]=inf;
24     Q.push(P(0,1));
25     while (!Q.empty())
26     {
27         int u=Q.top().second;Q.pop();
28         if (vis[u]) continue;vis[u]=1;
29         for (int i=head[u],v;i;i=num[i].next)
30           if (v=num[i].to,dis[u]+e[v].w<dis[e[v].v])
31             dis[e[v].v]=dis[u]+e[v].w,Q.push(P(dis[e[v].v],e[v].v));
32     }
33 }
34 int main()
35 {
36     n=read();m=read();qq=read();
37     for (int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read(),add(e[i].u,i);
38     dij();
39     while (qq--)
40     {
41         if (read()==1) x=dis[read()],printf("%lld\n",x==inf?-1:x);
42         else {
43             int k=read();
44             for (int i=1;i<=k;i++) e[read()].w++;
45             for (int i=2;i<=n;i++) d[i]=inf;
46             q[len=0].push(1);k=min(k,n-1);
47             for (int i=0;i<=len;i++)
48             {
49                 while (!q[i].empty())
50                 {
51                     u=q[i].front();q[i].pop();
52                     if (i>d[u]) continue;
53                     for (int i=head[u];i;i=num[i].next)
54                       if (v=num[i].to,tmp=d[u]+dis[u]+e[v].w-dis[e[v].v],tmp<d[e[v].v]&&tmp<=k)
55                             d[e[v].v]=tmp,q[tmp].push(e[v].v),len=max(len,tmp);
56                 }
57             }
58             for (int i=1;i<=n;i++) dis[i]=min(dis[i]+d[i],inf);
59         }
60     }
61    return 0;
62 }

猜你喜欢

转载自www.cnblogs.com/Scx117/p/9112959.html