ZJOI2006 物流运输

是最短路+动规的题型!

和codevs 1403是一样的,还要简单一些

主要不同的是没有加最开始的方案改变花费

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #define re register
  7 #define llint long long
  8 #define wl putchar('\n')
  9 #define read1(a) scanf("%d",&a)
 10 #define De(a) cout<<a<<endl
 11 using namespace std;
 12 const int inf = 0x3f3f3f3f;
 13 struct edge{
 14     int v,nxt,w;
 15 }e[10086<<1];
 16 int h[105],tot;
 17 inline void add(int x,int y,int w)
 18 {
 19     tot++,
 20     e[tot].v=y,
 21     e[tot].w=w,
 22     e[tot].nxt=h[x],
 23     h[x]=tot;
 24 }
 25 int ban[105][50];//第i天第j个点是否可用
 26 int T,n,K,m;//n点m边 
 27 llint cost[100][100];
 28 llint dp[100];
 29 
 30 llint dis[105];
 31 int vis[105];
 32 priority_queue < pair<int,int> > q;
 33 
 34 inline llint dijkstra(int t1,int t2)
 35 {
 36     for(int i=1;i<=n;i++)
 37     {
 38         dis[i]=inf,vis[i]=0;
 39     }
 40     for(int t=t1;t<=t2;t++)
 41     {
 42         for(int i=1;i<=n;i++)
 43         {
 44             if(ban[t][i]) vis[i]=1;
 45         }
 46     }
 47     dis[1]=0;
 48     q.push(make_pair(-0,1));
 49     while(!q.empty())
 50     {
 51         int x=q.top().second;
 52         q.pop();
 53         if(vis[x]) continue;
 54         vis[x]=1;
 55         for(int i=h[x];i;i=e[i].nxt)
 56         {
 57             int v=e[i].v,w=e[i].w;
 58             if(dis[v]>dis[x]+w && )
 59             {
 60                 dis[v]=dis[x]+w,
 61                 q.push(make_pair(-dis[v],v));
 62             }
 63         }
 64     }
 65     return dis[n];
 66 }
 67 
 68 
 69 int qq;
 70 int a,b,c;
 71 int main()
 72 {
 73     scanf("%d%d%d%d",&T,&n,&K,&m);
 74     for(int i=1;i<=m;i++)
 75     {
 76         scanf("%d%d%d",&a,&b,&c);
 77         add(a,b,c),add(b,a,c);
 78     }
 79     scanf("%d",&qq);
 80     for(int i=1;i<=qq;i++)
 81     {
 82         scanf("%d%d%d",&c,&a,&b);
 83         for(int j=a;j<=b;j++)
 84         {
 85             ban[j][c]=1;//ab范围内点c不可用 
 86         }
 87     }
 88     
 89     for(int i=1;i<=T;i++)
 90     {
 91         for(int j=i;j<=T;j++)
 92         {
 93             cost[i][j]=dijkstra(i,j);//cost表示从i到j天若不改变方案 的最短路 
 94         }
 95     }
 96     
 97     for(int i=1;i<=T;i++)
 98     {
 99         dp[i]=cost[1][i]*i;//初始化为从未改变方案的花费,这里忘了乘i 改半天 
100         for(int j=1;j<i;j++)
101         {
102             if(cost[j+1][i]!=inf)
103                 dp[i]=min(dp[i],dp[j]+cost[j+1][i]*(i-j)+K);//从j天转移过来,第j+1到i天都在使用新的方案,故+K 
104         }
105     }
106     printf("%lld",dp[T]);
107     
108 }

 

posted @ 2018-12-02 12:09  tythen  阅读(112)  评论(0编辑  收藏  举报