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