是最短路+动规的题型!
和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(' ') 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 }