#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define CI const int
#define int long long
using namespace std;
const int N=1e3+5,M=1e4+5,inf=2e9+5;
int n,m,k,e,d,dp[N],cant_vis[N],cl[N][N],co[N][N];
int tot,head[N],Next[M],vet[M],len[M];
int dis[N],vis[N];
struct node
{
int u,v;
node(){}
node(CI& a,CI& b):u(a),v(b){}
bool operator<(const node& x)const{ return dis[x.u]<dis[u]; }
};
int read(int &v)
{
int f=1; char ch;
for(ch='*';!isdigit(ch) && ch!='-';ch=getchar());
if(ch=='-') f=-1,ch=getchar();
for(v=0;isdigit(ch);v=v*10+ch-'0',ch=getchar());
v*=f;
return v;
}
void add(int a,int b,int c)
{
Next[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
}
void dij()
{
priority_queue<node> q;
fill(dis+1,dis+1+m,inf);
fill(vis+1,vis+1+m,0);
dis[1]=0,q.push(node(1,0));
while(!q.empty())
{
int u=q.top().u; q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];~i;i=Next[i])
{
int v=vet[i];
if(cant_vis[v]) continue;
if(dis[v]>dis[u]+len[i])
{
dis[v]=dis[u]+len[i];
if(!vis[v]) q.push(node(v,dis[v]));
}
}
}
}
signed main()
{
tot=-1,memset(head,-1,sizeof(head));
read(n),read(m),read(k),read(e);
for(int i=1;i<=e;i++)
{
int u,v,w;
read(u),read(v),read(w);
add(u,v,w),add(v,u,w);
}
read(d);
for(int i=1;i<=d;i++)
{
int t,x,y;
read(t),read(x),read(y);
for(int j=x;j<=y;j++) cl[t][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
fill(cant_vis+1,cant_vis+1+m,0);
for(int r=i;r<=j;r++)
for(int l=1;l<=m;l++)
if(cl[l][r]) cant_vis[l]=1;
dij(),co[i][j]=dis[m];
}
fill(dp+1,dp+1+n,inf);
for(int i=1;i<=n;i++)
{
dp[i]=co[1][i]*i;
for(int j=i-1;j>=0;j--)
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
}
printf("%lld",dp[n]);
return 0;
}
上面的是 AC 代码,但是之前我把inf 改成 1018 就一直 80 pts,强烈怀疑是 dis 和 dp 数组的锅,但是为什么呢?
代码参(chao)考(xi)第一篇题解的,开头加了 #define int long long。