记录编号 78058 评测结果 AAAAAAAAAA
题目名称 运输公司 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 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;
}