记录编号 |
78058 |
评测结果 |
AAAAAAAAAA |
题目名称 |
运输公司 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.019 s |
提交时间 |
2013-11-03 08:51:23 |
内存使用 |
0.36 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int SIZEN=21,SIZED=101,SIZEL=3000;
const int INF=0x7ffffff;
//右起第i位表示节点i(从1计数)
int day,n;//与题中不同,day是天数,n是码头数
int K,m;//m就是e,边数
vector<pair<int,int> > c[SIZEN];
bool able[SIZED][SIZEN]={0};
int mindist[SIZED][SIZED]={0};
int Dijkstra(bool nowable[]){//从1到n
int f[SIZEN]={0},used[SIZEN]={0};
priority_queue<pair<int,int> > Q;
int i;
int s=1,t=n;
for(i=1;i<=n;i++) f[i]=INF,used[i]=false;
f[s]=0,used[s]=true,Q.push(make_pair(-f[s],s));
int u,v;
while(!Q.empty()){
u=Q.top().second,Q.pop();
for(i=0;i<c[u].size();i++){
v=c[u][i].first;
if(!nowable[v]) continue;
if(f[v]>f[u]+c[u][i].second){
f[v]=f[u]+c[u][i].second;
if(!used[v]){
used[v]=true;
Q.push(make_pair(-f[v],v));
}
}
}
}
return f[t];
}
void getdist(void){
bool nowable[SIZEN];
int i,j,k;
for(i=1;i<=day;i++){
for(j=1;j<=n;j++) nowable[j]=true;
for(j=i;j<=day;j++){//第i天到第j天
for(k=1;k<=n;k++) nowable[k]=(nowable[k]&&able[j][k]);
mindist[i][j]=Dijkstra(nowable);
}
}
}
void DP(void){
int f[SIZED]={0};
int i,j;
for(i=1;i<=day;i++) f[i]=INF;
for(i=1;i<=day;i++){
for(j=0;j<i;j++){
if(mindist[j+1][i]==INF) continue;
f[i]=min(f[i],f[j]+mindist[j+1][i]*(i-j)+K);
}
}
cout<<f[day]-K<<endl;
}
void init(void){
scanf("%d%d%d%d",&day,&n,&K,&m);
int i,j;
int u,v,w;
for(i=1;i<=day;i++) for(j=1;j<=n;j++) able[i][j]=true;
for(i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
c[u].push_back(make_pair(v,w));
c[v].push_back(make_pair(u,w));
}
int d;
int p,a,b;
scanf("%d",&d);
for(i=1;i<=d;i++){
scanf("%d%d%d",&p,&a,&b);
for(j=a;j<=b;j++) able[j][p]=false;
}
}
int main(){
freopen("transz.in","r",stdin);
freopen("transz.out","w",stdout);
init();
getdist();
DP();
/*for(int i=1;i<=day;i++){
for(int j=i;j<=day;j++) cout<<mindist[i][j]<<" ";
cout<<endl;
}*/
return 0;
}