比赛 20111104 评测结果 WAWWWWWWWW
题目名称 运输公司 最终得分 10
用户昵称 kaaala 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-04 19:36:51
显示代码纯文本
#include<iostream>
#include<fstream>
#include<cstring>

using namespace std;

const int oo=0x7fffffff;

int Map[104][104],tj[104][104],f[104],n,m,k,e,d;

int spfa(int x,int y)
{
	int i,j,mxx,k;
	long long d[104];
	bool v[104];
	memset(v,0,sizeof(v));
	for(i=1;i<=n;i++)
		d[i]=oo;
	d[1]=0;
	for(i=x;i<=y;i++)
		for(j=1;j<=tj[i][0];j++)
			v[tj[i][j]]=true;
	for(i=1;i<n;i++)
	{
		mxx=oo;
		for(j=1;j<=n;j++)
			if(!v[j]&&d[j]<mxx)
			{
				k=j;
				mxx=d[j];
			}
		v[k]=true;
		for(j=1;j<=n;j++)
			if(d[j]>d[k]+Map[k][j])
				d[j]=d[k]+Map[k][j];
	}
	return d[n];
}

int main()
{
	int i,j,x,y,z;
	ifstream fin("transz.in");
	ofstream fout("transz.out");
	fin>>n>>m>>k>>e;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(i==j)
				Map[i][j]=0;
			else
				Map[i][j]=oo;
	for(i=1;i<=e;i++)
	{
		fin>>x>>y>>z;
		if(Map[x][y]>z)
		{
			Map[x][y]=z;
			Map[y][x]=z;
		}
	}
	fin>>d;
	for(i=1;i<=d;i++)
	{
		fin>>x>>y>>z;
		for(j=y;j<=z;j++)
		{
			tj[j][0]++;
			tj[j][tj[j][0]]=x;
		}
	}
	for(i=1;i<=m;i++)
	{
		f[i]=oo;
		for(j=0;j<i;j++)
		{
			z=spfa(j+1,i);
			if(z==oo)
				continue;
			if(f[i]>f[j]+z*(i-j)+k)
				f[i]=f[j]+z*(i-j)+k;
		}
	}
	fout<<f[m]-k<<endl;
	fin.close();
	fout.close();
	return 0;
}