DP+SPFA?貌似很水,可要看了题解后才秒懂,自己想不出QAQ

 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 }
View Code

 

posted on 2015-08-15 00:24  onlyRP  阅读(135)  评论(0编辑  收藏  举报