记录编号 38083 评测结果 AAAAAAAAAA
题目名称 运输公司 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.028 s
提交时间 2012-04-12 12:45:51 内存使用 0.35 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#define MAXN 101
#define MAXM 21
#define pb(i) push_back(i)
#define read scanf
#define write printf
#define loop(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int INF=~0u>>2;
int N,M,K,E,D,F[MAXN];
bool Flag[MAXN][MAXM];
int Cost[MAXN][MAXN];
vector<int> Map[MAXM];
vector<int> Val[MAXM];

void init()
{
	read("%d %d %d %d\n",&N,&M,&K,&E);
	memset(Flag,0,sizeof(Flag));
	int a,b,c;loop(i,1,E) 
	{
		read("%d %d %d\n",&a,&b,&c); 
		Map[a].pb(b);  Val[a].pb(c);
		Map[b].pb(a);  Val[b].pb(c);
	}	read("%d\n",&D); loop(i,1,D)
	{
		read("%d %d %d\n",&a,&b,&c);
		loop(j,b,c) Flag[j][a]=1;
	}
}

bool check(int l,int r,int p)
{
	loop(i,l,r) if(Flag[i][p]) return false; return true;
}

int SPFA(int l,int r)
{
    int dist[MAXM],flag[MAXM];
    loop(i,1,M) dist[i]=INF,flag[i]=0;
    loop(i,1,M) if(!check(l,r,i)) flag[i]=1;
    queue<int> Q;
    int u,v; Q.push(1); dist[1]=0; flag[1]=1;
    int cost,newdist;
    while(!Q.empty())
    {
        u=Q.front(); Q.pop(); cost=dist[u]; flag[u]=0;
        for(unsigned int i=0;i<Map[u].size();i++)
        {
            v=Map[u][i];
            newdist=Val[u][i]+cost;
            if(dist[v]>newdist)
            {
                dist[v]=newdist;
                if(!flag[v]) Q.push(v),flag[v]=1;
            }
        }
    }
    return dist[M];
}

inline int Min(int a,int b) {return a<b?a:b;}

void dp()
{
	F[0]=0;
	loop(i,1,N)
	{
		F[i]=INF;
		for(int j=0;j<=i-1;j++)
		{
			int c=SPFA(j+1,i);
			if(c==INF) continue;
			F[i]=Min(F[i],F[j]+c*(i-j)+K);
		}
	}
	write("%d\n",F[N]-K);
}

int main()
{
	freopen("transz.in","r",stdin);
	freopen("transz.out","w",stdout);
	init();
	dp();
	return 0;
}