标签:情况 cost pop set code cstring define ret efi
/************************************************************** Problem: 1003 User: lxy8584099 Language: C++ Result: Accepted Time:60 ms Memory:1124 kb ****************************************************************/ /* 数据范围过小 预处理cost i~j 表示第i天到第j天 都能走的最短路 没有的话应该是inf n^2 dp 枚举最近的一次换路 计算相应贡献值去最小 注意可能从第0天转移过来 所以 dp[0]=-k 可以抵消 */ #include<queue> #include<cstdio> #include<cstring> #include<utility> #define inf (0x3fffffff) #define min(a,b) ((a>b)?(b):(a)) using namespace std; const int N=105,M=105; struct pp {int v,nxt,d;} e[(N*N)<<1]; int head[N],cost[N][N],p[N],a[N],b[N]; int n,m,k,road,T,tot; int dp[N],dis[N]; bool vis[N]; priority_queue < pair < int,int > > q; void add(int u,int v,int d) { e[++tot].nxt=head[u];head[u]=tot; e[tot].v=v;e[tot].d=d; } void dijk(int L,int R) { memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); dis[1]=0;q.push(make_pair(0,1)); for(int i=1;i<=T;i++) if(L>b[i]||R<a[i]); else vis[p[i]]=1; while(!q.empty()) { int u=q.top().second; q.pop(); if(vis[u]) continue; vis[u]=1; for(int j=head[u];j;j=e[j].nxt) { int v=e[j].v,d=e[j].d; if(dis[v]>dis[u]+d) { dis[v]=dis[u]+d; q.push(make_pair(-dis[v],v)); } } } cost[L][R]=dis[m]; //一共是m个 码头,,用n 用惯了, } int main() { scanf("%d%d%d%d",&n,&m,&k,&road); for(int i=1,u,v,d;i<=road;i++) { scanf("%d%d%d",&u,&v,&d); add(u,v,d);add(v,u,d); } scanf("%d",&T); for(int i=1;i<=T;i++) { scanf("%d%d%d",&p[i],&a[i],&b[i]); } for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) dijk(i,j); memset(dp,0x3f,sizeof(dp)); dp[0]=-k; // dp 0 的情况 for(int i=1;i<=n;i++) for(int j=0;j<i;j++) if(cost[j+1][i]!=1061109567&&dp[j]!=1061109567) dp[i]=min(dp[i],dp[j]+cost[j+1][i]*(i-j)+k); printf("%d\n",dp[n]); return 0; }
标签:情况 cost pop set code cstring define ret efi
原文地址:https://www.cnblogs.com/lxy8584099/p/10140278.html