比赛 |
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);
}