• Source
    1. #include <cstdio>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <queue>
    5. // by zrt
    6. // problem:
    7. // 无论你在什么时候开始,重要的是开始以后就不要停止。
    8. using namespace std ;
    9. typedef long long LL ;
    10. const double eps(1e-10) ;
    11. const int inf(0x3f3f3f3f) ;
    12. int tt,kase;
    13. int H[210],X[440000],P[440000],flow[440000],tot,from[440000],cost[440000];
    14. inline void add(int x,int y,int z,int k){
    15. P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;from[tot]=x;cost[tot]=k;
    16. }
    17. int mi[105],ni[105],pi[105],si[105],ei[105];
    18. LL f,c;int S,T;
    19. int d[210],a[210],p[210];
    20. struct N{
    21. int x,w;
    22. N(int a=0,int b=0){
    23. x=a,w=b;
    24. }
    25. friend bool operator < (N a,N b){
    26. return a.w>b.w;
    27. }
    28. };
    29. priority_queue<N> q;
    30. bool spfa(){
    31. memset(d,0x3f,sizeof d);
    32. d[S]=0;q.push(N(S,0));int x;
    33. a[S]=inf;
    34. while(!q.empty()){
    35. x=q.top().x;q.pop();
    36. for(int i=H[x];i;i=X[i]){
    37. if(flow[i]>0&&d[P[i]]>d[x]+cost[i]){
    38. d[P[i]]=d[x]+cost[i];
    39. a[P[i]]=min(flow[i],a[x]);
    40. p[P[i]]=i;
    41. q.push(N(P[i],d[P[i]]));
    42. }
    43. }
    44. while(!q.empty()&&d[q.top().x]!=q.top().w) q.pop();
    45. }
    46. if(d[T]>=0) return 0;
    47. f+=a[T];
    48. c+=a[T]*1LL*d[T];
    49. x=T;
    50. while(x!=S){
    51. flow[p[x]]-=a[T];
    52. flow[p[x]^1]+=a[T];
    53. x=from[p[x]];
    54. }
    55. return 1;
    56. }
    57. int main(){
    58. #ifdef LOCAL
    59. freopen("in.txt","r",stdin) ;
    60. freopen("out.txt","w",stdout) ;
    61. #endif
    62. scanf("%d",&tt);
    63. S=0,T=209;
    64. while(tt--){
    65. kase++;
    66. tot=1;memset(H,0,sizeof H);
    67. int m,I;
    68. scanf("%d%d",&m,&I);
    69. for(int i=1;i<=m;i++){
    70. scanf("%d%d%d%d%d",&mi[i],&ni[i],&pi[i],&si[i],&ei[i]);
    71. }
    72. for(int i=1;i<=m;i++){
    73. add(S,i<<1,ni[i],mi[i]);
    74. add(i<<1,S,0,-mi[i]);
    75. for(int j=0;j<=ei[i];j++){
    76. if(j+i>m) break;
    77. add(i<<1,(i+j)<<1|1,inf,I*j);
    78. add((i+j)<<1|1,i<<1,0,-I*j);
    79. }
    80. add(i<<1|1,T,si[i],-pi[i]);
    81. add(T,i<<1|1,0,pi[i]);
    82. }
    83. f=c=0;
    84. while(spfa());
    85. printf("Case %d: %lld\n",kase,-c);
    86. }
    87. return 0 ;
    88. }
    89.