DP+SPFA?貌似很水,可要看了题解后才秒懂,自己想不出QAQ
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(i=l;i<=r;i++) 3 #define dec(i,l,r) for(i=l;i>=r;i--) 4 #define inf 1e9 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define NM 100+5 7 using namespace std; 8 struct edge{ 9 int t,v; 10 edge *next; 11 }e[1000],*h[NM]; 12 struct tmp{ 13 int s,t,v; 14 }a[1000]; 15 int c[NM][NM],i,j,k,va,n,m,p,s,d[NM],x,y,t,f[NM]; 16 bool v[NM],b[NM]; 17 queue<int >q; 18 void add(int x,int y,int v){ 19 e[++s].t=y;e[s].v=v;e[s].next=h[x];h[x]=&e[s]; 20 } 21 int spfa(){ 22 mem(v);mem(d); 23 q.push(1);v[1]++;d[1]++; 24 while(!q.empty()){ 25 int t=q.front();v[t]=false;q.pop(); 26 for(edge *j=h[t];j;j=j->next) 27 if(!b[j->t]&&(!d[j->t]||d[j->t]>d[t]+j->v)){ 28 d[j->t]=d[t]+j->v; 29 if(!v[j->t]){ 30 v[j->t]++;q.push(j->t); 31 } 32 } 33 } 34 return --d[m]; 35 } 36 int main(){ 37 scanf("%d%d%d%d",&n,&m,&va,&p); 38 inc(i,1,p){ 39 scanf("%d%d%d",&x,&y,&t); 40 add(x,y,t);add(y,x,t); 41 } 42 scanf("%d",&p); 43 inc(i,1,p)scanf("%d%d%d",&a[i].v,&a[i].s,&a[i].t); 44 inc(i,1,n) 45 inc(j,i,n){ 46 mem(b); 47 inc(k,1,p) 48 if(i<=a[k].t&&j>=a[k].s)b[a[k].v]++; 49 c[i][j]=spfa(); 50 } 51 inc(i,1,n)f[i]=inf;f[0]=-va; 52 inc(i,1,n) 53 inc(j,1,i) 54 if(c[j][i]!=-1)f[i]=min(f[i],f[j-1]+c[j][i]*(i-j+1)+va); 55 printf("%d",f[n]); 56 return 0; 57 }