Sol-Dp-最短路-物流運輸

SPFA套DP的不錯的題(洛咕評分太水以至於都是藍題其實也就NOIpD1T2難度

dp[i]=min(dp[j]+dist(j+1,i)(ij+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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章