SPFA套DP的不错的题(洛咕评分太水以至于都是蓝题其实也就NOIpD1T2难度
,
关于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;
}