| 比赛 | 20110916 | 评测结果 | WWWWWWWWWWA | 
    | 题目名称 | 找工作 | 最终得分 | 9 | 
    | 用户昵称 | 苏轼 | 运行时间 | 0.004 s | 
    | 代码语言 | C++ | 内存使用 | 0.30 MiB | 
    | 提交时间 | 2011-09-16 20:45:58 | 
显示代码纯文本
#include <cstdio>
#include <cstdlib>
using namespace std;
struct way_t {
	int en, p;
	way_t *next;
};
struct waylist {
	way_t *head;
};
waylist way[300];
int boo[300], maxp[300], maxcurr;
int D, P, C, F, S;
void addway (waylist *l, const int en, const int p = 0)
{
	way_t *newt = (way_t*)malloc(sizeof(way_t));
	newt->en = en;
	newt->p = p;
	newt->next = l->head;
	l->head = newt;
}
int go (const int wh, int cp)
{
	cp += D;
	
	if (boo[wh])
		return cp>boo[wh] ? -1:D;
	if (maxp[wh] > 0)
		return wh;
		
	boo[wh] = cp;
	
	int mp = 0;
	for (way_t *zz=way[wh].head; zz; zz=zz->next)
	{
		if (zz->p <=cp)
		{
			int tmp;
			if ((tmp = go(zz->en, cp-zz->p)-zz->p) > mp)
				mp = tmp;
			if (tmp <= -1)
				return -1;
		}
	}
	
	boo[wh] = 0;
	
	if (cp+mp>maxcurr)
		maxcurr = cp+mp;
	
	return (maxp[wh] = mp);
}
int main ()
{
	freopen("jobhunt.in", "r", stdin);
	freopen("jobhunt.out", "w", stdout);
	
	scanf("%d %d %d %d %d", &D, &P, &C, &F, &S);
	for (int i=0; i<P; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		addway(way+a, b);
	}
	
	for (int i=0; i<F; i++)
	{
		int a, b, p;
		scanf("%d %d %d", &a, &b, &p);
		addway(way+a, b, p);
	}
	
	if (go(S, 0) >= 0)
		printf("%d\n", maxcurr);
	else
		printf("-1\n");
	
	return 0;
}