就这行初始化,为什么要写这个?不写为什么就错了呢。。
f[i]=1ll∗cost[1][i]∗i;
//dp+最短路毒瘤题
//此题状态转移像computer。
//cost[i][j]表示第i天到第j天走同一条路的最短路
//f[i]表示截止到第i天总共的最小花费,枚举j<=i,可以被第1-j天转移
//f[i]=min(f[i],f[j-1]+cost[j][i]*(j-i+1)+k)
//把cost[i][j]全预处理出来。
//每次跑spfa预处理cost之前先扫一遍所有的点,把不能经过的点标记出来
#include<bits/stdc++.h>
using namespace std;
int n,m,k,e,idx,d;
int dis[100010],head[100010],vis[100010],cost[110][110],used[110][110],cant[110];
long long f[110];
struct node{
int nxt,to,w;
}edge[100010];
void add(int u,int v,int w)
{
edge[++idx].nxt=head[u];
edge[idx].to=v;
edge[idx].w=w;
head[u]=idx;
}
void spfa(int s)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s);
vis[s]=1;
dis[s]=0;
while(q.size())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
if(cant[y])
continue;
if(dis[x]+edge[i].w<dis[y])
{
dis[y]=dis[x]+edge[i].w;
if(!vis[y])
{
q.push(y);
vis[y]=1;
}
}
}
}
}
int main()
{
cin>>n>>m>>k>>e;
for(int i=1;i<=e;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
cin>>d;
for(int i=1;i<=d;i++)
{
int p,a,b;
scanf("%d%d%d",&p,&a,&b);
for(int j=a;j<=b;j++)
{
used[p][j]=1;//表示第p个港口第j天不能通行
}
}
for(int i=1;i<=n;i++)//预处理cost[i][j]
{
for(int j=1;j<=n;j++)
{
memset(cant,0,sizeof(cant));
for(int ii=i;ii<=j;ii++)
{
for(int jj=1;jj<=m;jj++)//处理出码头关闭的时间段
{
if(used[jj][ii])
{
cant[jj]=1;
}
}
}
spfa(1);
cost[i][j]=dis[m];
}
}
memset(f,0x7f,sizeof(f));
for(int i=1;i<=n;i++)
{
f[i]=1ll*cost[1][i]*i;
for(int j=1;j<=i;j++)
{
f[i]=min(f[i],f[j-1]+1ll*cost[j][i]*(i-j+1)+k);
}
}
cout<<f[n];
return 0;
}