第一个点和第四个点WA
#include <iostream>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q;
ll n,m,k,e1,inf=1e17,h[110],v[110],dis[110],c[25][110],dp[110],cnt;
struct edge
{
ll to,next,d;
};
edge e[410];
void add(ll x,ll y,ll z)
{
cnt++;
e[cnt].to=y;
e[cnt].d=z;
e[cnt].next=h[x];
h[x]=cnt;
}
ll dj(ll a,ll b)
{
ll i,j;
memset(v,0,sizeof(v));
for(i=1;i<=m;i++)
{
for(j=a;j<=b;j++)
{
if(c[i][j]==1)
{
v[i]=1;
break;
}
}
}
dis[1]=0;
for(i=2;i<=m;i++) dis[i]=inf;
q.push(make_pair(0,1));
ll s1,s2;
while(!q.empty())
{
s1=q.top().second;
q.pop();
if(v[s1]==1) continue;
for(j=h[s1];j;j=e[j].next)
{
s2=e[j].to;
if(v[s2]==0&&dis[s2]>dis[s1]+e[j].d)
{
dis[s2]=dis[s1]+e[j].d;
q.push(make_pair(dis[s2],s2));
}
}
}
return dis[m];
}
int main()
{
ll i,j,x,y,z,p,a,b,d;
cin>>n>>m>>k>>e1;
for(i=1;i<=e1;i++)
{
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
cin>>d;
for(i=1;i<=d;i++)
{
cin>>p>>a>>b;
for(j=a;j<=b;j++)
{
c[p][j]=1;
}
}
for(i=2;i<=n;i++) dp[i]=inf;
for(i=2;i<=n;i++)
{
dp[i]=dj(1,i)*i;
for(j=0;j<i;j++)
{
dp[i]=min(dp[i],dp[j]+dj(j+1,i)*(i-j)+k);
}
}
cout<<dp[n];
return 0;
}