传送门:
http://www.lydsy.com/JudgeOnline/problem.php?id=1003
看了看题……不会……百度题解……真水……我好弱啊……唉……
Code:
#include<cstdio> #include<queue> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define X first #define Y second using namespace std; typedef pair<int,int> pii; pii w[21][21]; int can[21][101]; int vis[21]; int d[101]; int f[101],B; int n,m,k,e; int cost(int s,int t){ memset(vis,0,sizeof(vis)); memset(d,0x7f,sizeof(d)); B=d[0]; d[1]=0; for(int i=1;i<=m;i++){ for(int j=s;j<=t;j++){ if(!can[i][j]){ vis[i]=1; break; } } } priority_queue<pii,vector<pii>,greater<pii> >q; q.push(pii(d[1],1)); vis[1]=1; while(!q.empty()){ int u=q.top().Y;q.pop(); for(int i=1;i<=w[u][0].X;i++){ int v=w[u][i].X,W=w[u][i].Y; if(!vis[v]) if(d[v]>d[u]+W){ d[v]=d[u]+W; //vis[v]=1; q.push(pii(d[v],v)); } } } return d[m]==B?d[m]:d[m]*(t-s+1); } int main(){ memset(can,1,sizeof(can)); scanf("%d%d%d%d",&n,&m,&k,&e); for(int i=1;i<=e;i++){ int u,v,W; scanf("%d%d%d",&u,&v,&W); w[u][++w[u][0].X]=pii(v,W); w[v][++w[v][0].X]=pii(u,W); } int d; scanf("%d",&d); for(int i=1;i<=d;i++){ int a,b,c; scanf("%d%d%d",&c,&a,&b); for(int j=a;j<=b;j++)can[c][j]=0; } for(int i=1;i<=n;i++){ f[i]=cost(1,i); for(int j=2;j<i;j++){ f[i]=min(f[i],f[j]+cost(j+1,i)+k); } } cout<<f[n]<<endl; return 0; }