记录编号 27423 评测结果 AAAAAAAAAAA
题目名称 [USACO Nov09] 找工作 最终得分 100
用户昵称 GravatarCitron酱 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2011-09-22 11:46:57 内存使用 0.27 MiB
显示代码纯文本
#include <fstream>
#include <climits>

#define I_F "jobhunt.in"
#define O_F "jobhunt.out"

const int MAXn=220;

struct dllb
{
	int x;
	dllb *next;
};

struct lb
{
	int x, s;
	lb *next;
}*map[MAXn]={NULL};

int n,s,d;
int ans;

void Input();
void Spfa();
void Output();

int main()
{
	Input();
	Spfa();
	Output();
	return 0;
}

void Input()
{
	int p,f,x,y,t;
	lb *temp;
	std::ifstream fin(I_F);
	fin>>d>>p>>n>>f>>s;
	s--;
	for (int i=0; i<p; i++)
	{
		fin>>x>>y;
		x--, y--;
		temp=map[x];
		map[x]=new lb;
		map[x]->x=y;
		map[x]->s=-d;
		map[x]->next=temp;
	}
	for (int i=0; i<f; i++)
	{
		fin>>x>>y>>t;
		x--, y--;
		for (temp=map[x]; temp!=NULL; temp=temp->next)
			if (temp->x==y)
				break;
		if (temp==NULL)
		{
			temp=map[x];
			map[x]=new lb;
			map[x]->x=y;
			map[x]->s=t-d;
			map[x]->next=temp;
		}
	}
	fin.close();
}

void Spfa()
{
	int count[MAXn]={0};
	count[s]=1;
	int minl[MAXn];
	for (int i=0; i<n; minl[i++]=INT_MAX);
	minl[s]=0;
	dllb *pt[MAXn]={NULL};
	dllb *head=new dllb;
	dllb *tail=head, *temp;
	head->x=s;
	head->next=NULL;
	pt[s]=head;
	while (head!=NULL)
	{
		for (lb *i=map[head->x]; i!=NULL; i=i->next)
			if (i->s+minl[head->x]<minl[i->x])
			{
				if ((++count[i->x])>n)
				{
					ans=-1;
					return;
				}
				minl[i->x]=i->s+minl[head->x];
				if (pt[i->x]==NULL)
				{
					tail->next=new dllb;
					tail=tail->next;
					tail->x=i->x;
					tail->next=NULL;
					pt[i->x]=tail;
				}
			}
		pt[head->x]=NULL;
		temp=head;
		head=head->next;
		delete temp;
	}
	
	ans=INT_MAX;
	for (int i=0; i<n; i++)
		ans=(ans<minl[i])?ans:minl[i];
	ans=d-ans;
}

void Output()
{
	std::ofstream fout(O_F);
	fout<<ans<<std::endl;
	fout.close();
}