#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define M 500005
#define INF 2139062143
using namespace std;
int t[M*2],next[2*M],last[2*M],Time[2*M],dis[2*M],d[2*M];
bool bz[2*M];
int n,m,k,lim,L=0,ans=INF;
void add(int x,int y,int z)
{
t[++L]=y;
next[L]=last[x];
last[x]=L;
Time[L]=z;
}
inline int read(int &number)
{
char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') number=number*10+ch-'0',ch=getchar();
return number;
}
void SPFA(int s)
{
memset(dis,127,sizeof(dis));
// memset(d,0,sizeof(d));
memset(bz,false,sizeof(bz));
bz[s]=true;
dis[s]=0;
d[s]=1;
int l=0;
int r=1;
while (l<r)
{
int now=d[++l];
for (int i=last[now];i;i=next[i])
if (dis[now]+Time[i]<dis[t[i]])
{
dis[t[i]]=dis[now]+Time[i];
if (!bz[t[i]])
{
bz[t[i]]=true;
d[++r]=t[i];
}
}
bz[now]=false;
}
}
int main()
{
freopen("sigemago.in","r",stdin);
freopen("sigemago.out","w",stdout);
read(n);read(m);read(k);read(lim);
fo(i,1,m)
{
int x,y,z;
x=y=z=0;
read(x);read(y);read(z);
for (int j=0;j<=lim*2;j+=2)
{
add(x+n*j,y+n*(j+1),k);
add(x+n*(j+1),y+n*(j+2),0);
add(x+j*n,y+j*n,z);
}
}
SPFA(1);
for (int i=0;i<=lim*2;i+=2) ans=min(ans,dis[n*i+n]);
if (ans>=INF) printf("-1");
else printf("%d",ans);
return 0;
}
寄存 【GDOI 2016 Day2】第一题 SigemaGO
最新推荐文章于 2016-07-09 11:42:12 发布