bzoj 1003: [ZJOI2006]物流运输trans

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1003: [ZJOI2006]物流运输trans相关的知识,希望对你有一定的参考价值。

 1 #include<cstdio>
 2 #include<queue>
 3 #include<iostream>
 4 #include<cstring>
 5 #define M 1000
 6 using namespace std;
 7 int n,m,k,e,cnt,head[M],next[2*M],u[2*M],v[2*M],f[110][110],b[110];
 8 int f1[110];
 9 long long t[110][110],ff[110];
10 void jia(int a1,int a2,int a3)
11 {
12     cnt++;
13     next[cnt]=head[a1];
14     u[cnt]=a2;
15     v[cnt]=a3;
16     head[a1]=cnt;
17     return;
18 }
19 int sp(int x,int y)
20 {
21     memset(b,0,sizeof(b));
22     memset(f1,0,sizeof(f1));
23     for(int i=x;i<=y;i++)
24       for(int j=1;j<=m;j++)
25         if(f[i][j])
26           b[j]=1;
27     queue<int>q;
28     q.push(1);
29     f1[1]=1;
30     int d[22];
31     for(int i=2;i<=m;i++)
32       d[i]=0x7fffffff;
33     d[1]=0;
34     for(;!q.empty();)
35       {
36         int p=q.front();
37         q.pop();
38         f1[p]=0;
39         for(int i=head[p];i;i=next[i])
40           if(!b[u[i]]&&d[u[i]]>d[p]+v[i])
41             {
42                 d[u[i]]=d[p]+v[i];
43                 if(!f1[u[i]])
44                   {
45                     q.push(u[i]);
46                     f1[u[i]]=1;
47                   }
48             }
49       }
50     return(d[m]);
51 }
52 void dp()
53 {
54     for(int i=1;i<=n;i++)
55       {
56         ff[i]=(long long)t[1][i]*i;
57         for(int j=1;j<i;j++)
58           ff[i]=min(ff[i],ff[j]+k+t[j+1][i]*(i-j));
59       }
60     return;
61 }
62 int main()
63 {
64     scanf("%d%d%d%d",&n,&m,&k,&e);
65     for(int i=1;i<=e;i++)
66       {
67         int a1,a2,a3;
68         scanf("%d%d%d",&a1,&a2,&a3);
69         jia(a1,a2,a3);
70         jia(a2,a1,a3);
71       }
72     int d;
73     scanf("%d",&d);
74     for(int i=1;i<=d;i++)
75       {
76         int x,y,z;
77         scanf("%d%d%d",&x,&y,&z);
78         for(int j=y;j<=z;j++)
79           f[j][x]=1;
80       }
81     for(int i=1;i<=n;i++)
82       for(int j=1;j<=n;j++)
83     {
84         t[i][j]=sp(i,j);
85 //      printf("%d\n",t[i][j]);
86     }
87     dp();
88     printf("%d\n",ff[n]);
89     return 0;
90 }

先用SPFA处理出每一段时间的最短路,然后dp

以上是关于bzoj 1003: [ZJOI2006]物流运输trans的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1003 [ZJOI2006]物流运输

bzoj1003[ZJOI2006]物流运输

BZOJ 1003: [ZJOI2006]物流运输

bzoj 1003: [ZJOI2006]物流运输

bzoj1003: [ZJOI2006]物流运输

BZOJ 1003: [ZJOI2006]物流运输