Sol-Dp-最短路-物流运输

SPFA套DP的不错的题(洛咕评分太水以至于都是蓝题其实也就NOIpD1T2难度

d p [ i ] = m i n ( d p [ j ] + d i s t ( j + 1 , i ) ( i j + 1 ) + k ) dp[i]=min(dp[j]+dist(j+1,i)∗(i−j+1)+k) ,
关于dist[] : SPFA/Floyd/dijkstra选一个吧

#include<iostream>
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define loop(I,X,Y) for(int I = (X) , end = (Y) ; I <= end ; ++I)
using namespace std;
int n,m,k,e;
int map[21][21];
int d;
int a[21][110];
int dp[110];
int now[21];

int spfa(){
    queue<int> q;
    int dis[21];
    int vis[21];
    loop(i,1,m) dis[i]=0x7ffffff,vis[i]=0;
    dis[1]=0;
    q.push(1);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
	loop(i,1,m)	
            if(now[i]) continue;
            if(map[u][i]>0&&dis[i]>dis[u]+map[u][i]){
                dis[i]=dis[u]+map[u][i];
                if(vis[i]==0){
                    q.push(i);
                    vis[i]=1;
                }
            }
        }
    }
    return dis[m];
}

int main(){
    scanf("%d%d%d%d",&n,&m,&k,&e)
    loop(i,1,m)
        loop(j,1,m)
            map[i][j]=0x7ffffff ;
    loop(i,1,e){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z) ;
        map[x][y] = map[y][x] = z ;
    }
    scanf("%d",&d) ;
    loop(i,1,d){
        int aa,b,p;
        scanf("%d%d%d",&p,&aa,&b) ;
        loop(j,aa,b)
            a[p][j]=1;
    }
    loop(i,1,n) dp[i]=0x7ffffff;
    dp[0]=-k;
    loop(i,1,n){
        memset(now,0,sizeof(0));
        loop(l,1,m) now[l]=0;
        for(int j=i;j>=1;j--){
            loop(l,1,m)
                now[l]|=a[l][j];
            int _ll=spfa();
            if(_ll==0x7ffffff)continue;
            dp[i]=min(dp[i],dp[j-1]+_ll*(i-j+1)+k);
        }
    }
    printf("%d",dp[n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42000775/article/details/83514719