比赛 |
20110414 |
评测结果 |
AAAAAAAAEE |
题目名称 |
冲浪 |
最终得分 |
80 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-04-14 09:03:48 |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int maxm=155555;
const int maxn=55555;
int n,m,k,eh;
struct edge
{
int t,c;
edge *next;
}E[maxn],*V[maxn];
int ind[maxn];
inline void addedge(int a,int b,int c)
{
E[++eh].next=V[a]; V[a]=E+eh; V[a]->t=b; V[a]->c=c;
ind[b]++;
}
void init()
{
scanf("%d%d%d",&n,&m,&k);
int a,b,c;
for (;m;--m)
{
scanf("%d%d%d",&a,&b,&c);
addedge(b,a,c);
}
}
long long f[maxn][11];
long long g[maxn][11];
int x[maxn],xn;
int stack[maxn],sh;
void topsort()
{
x[++xn]=n;
stack[++sh]=n;
while (sh!=0)
{
int u=stack[sh--];
for (edge *e=V[u];e;e=e->next)
{
if (--ind[e->t]==0)
{
stack[++sh]=e->t;
x[++xn]=e->t;
}
}
}
}
long long min(long long a,long long b)
{
if (a==-1) return b;
if (b==-1) return a;
else return a<b ? a : b;
}
void dp(int u)
{
for (int i=0;i<=k;i++)
f[u][i]=min(f[u][i],g[u][i]);
for (edge *e=V[u];e;e=e->next)
{
int v=e->t;
for (int i=0;i<=k;i++)
if (f[u][i]!=-1)
{
f[v][i]=max(f[v][i],f[u][i]+e->c);
if (i<k)
g[v][i+1]=min(g[v][i+1],f[u][i]+e->c);
}
}
}
void solve()
{
topsort();
memset(g,-1,sizeof(g));
f[n][0]=0;g[n][0]=0;
for (int i=1;i<=n;i++)
dp(x[i]);
printf("%lld\n",f[1][k]);
}
int main()
{
freopen("slide.in","r",stdin);
freopen("slide.out","w",stdout);
init();
solve();
return 0;
}