比赛 20111104 评测结果 AWWWWWWWWA
题目名称 运输公司 最终得分 20
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-04 20:34:26
显示代码纯文本
//第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。
//n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本。
#include <cstdio>
using namespace std;

int way[21],map[21][20],dis[21][20],pathnum=0,path[20]={0};
bool una[21][101]={{false}};

int bfs(int timnow,int changecost,int n)
{
	int i,pos[400]={1},cos[400]={0},dad[400]={-1},len[400]={1},tail=0,head=0,minhead,mincost=2000000000,temp,temppn;
	bool used[21]={true,true},changed=false;
	while (tail<=head)
	{
		used[pos[tail]]=true;
		for (i=0;i<way[pos[tail]];i++)
		{
			if (!una[map[pos[tail]][i]][timnow]&&!used[map[pos[tail]][i]])
			{
				head++;
				pos[head]=map[pos[tail]][i];
				cos[head]=cos[tail]+dis[pos[tail]][i];
				dad[head]=tail;
				len[head]=len[tail]+1;
				if (pos[head]==n&&cos[head]<mincost)
				{
					mincost=cos[head];
					minhead=head;
				}
			}
		}
		tail++;
	}
	if (pathnum==0)
	{
		temp=minhead;
		temppn=0;
		while (temp!=-1)
		{
			path[temppn]=pos[temp];
			temppn++;
			temp=dad[temp];
		}
		pathnum=temppn;
		return(mincost);
	}
	else if (len[minhead]!=pathnum)
	{
		temp=minhead;
		temppn=0;
		while (temp!=-1)
		{
			path[temppn]=pos[temp];
			temppn++;
			temp=dad[temp];
		}
		pathnum=temppn;
		return(mincost+changecost);
	}
	else
	{
		temp=minhead;
		temppn=0;
		while (temp!=-1)
		{
			if (path[temppn]!=pos[temp])
			{
				path[temppn]=pos[temp];
				changed=true;
			}
			temppn++;
			temp=dad[temp];
		}
		pathnum=temppn;
		if (changed)
			return(mincost+changecost);
		else
			return(mincost);
	}
}

int main(void)
{
	freopen("transz.in","r",stdin);
	freopen("transz.out","w",stdout);
	int i,j,totaltim,n,changecost,m,timnow,totalcost=0,temp,temp2,temp3;
	scanf("%d %d %d %d\n",&totaltim,&n,&changecost,&m);
	if (n==1)
	{
		printf("0\n");
		fclose(stdin);
		fclose(stdout);
		return(0);
	}
	for (i=0;i<m;i++)
	{
		scanf("%d %d %d\n",&temp,&temp2,&temp3);
		map[temp][way[temp]]=temp2;
		map[temp2][way[temp2]]=temp;
		dis[temp][way[temp]]=temp3;
		dis[temp2][way[temp2]]=temp3;
		way[temp]++;
		way[temp2]++;
	}
	scanf("%d\n",&m);
	for (i=0;i<m;i++)
	{
		scanf("%d %d %d\n",&temp,&temp2,&temp3);
		for (j=temp2;j<=temp3;j++)
			una[temp][j]=true;
	}
	for (timnow=1;timnow<=totaltim;timnow++)
	{
		temp=bfs(timnow,changecost,n);
		totalcost+=temp;
	}
	printf("%d\n",totalcost);
	fclose(stdin);
	fclose(stdout);
	return(0);
}