10分求调
查看原帖
10分求调
593921
黄海辰楼主2024/7/15 14:26
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h[10005],k,ee,cnt,f[1055],bad[100005],dis[100004],w[1005][1005],dp[1005],a[1005][1005];
struct node
{
	int v,nxt,w;
} e[100055];
struct nd
{
	int dis,x;
	bool operator<(const nd &a)const
	{
		return a.dis < dis;
	}
};
void add(int u,int v,int w)
{
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=h[u];
	h[u]=cnt;
}
priority_queue<nd>q;
void dij()
{
	for(int i=1; i<=m; i++)dis[i]=1e9;
	memset(f,0,sizeof(f));
	dis[1]=0;
	q.push({0,1});
	while(!q.empty())
	{
		int xx=q.top().x,d=q.top().dis;
		q.pop();
		if(f[xx])continue;
		f[xx]=1;
		for(int i=h[xx]; i; i=e[i].nxt)
		{
			int v=e[i].v;
			if(bad[v])continue;
			if(dis[xx]+e[i].w<=dis[v])
			{
				dis[v]=dis[xx]+e[i].w;
				q.push({dis[v],v});
			}
		}
	}
}
signed main()
{
	cin>>n>>m>>k>>ee;
	for(int i=1; i<=ee; i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	int d;
	cin>>d;
	for(int i=1; i<=d; i++)
	{
		int p,x,y;
		cin>>p>>x>>y;
		for(int j=x; j<=y; j++)
		{
			w[j][++w[j][0]]=p;
		}
	}
	for(int i=1; i<=n; i++)
	{
		for(int j=i; j<=n; j++)
		{
			for(int k=1; k<=m; k++)bad[k]=0;
			for(int k=i; k<=j; k++)
			{
				for(int p=1; p<=w[k][0]; p++)
					bad[w[k][p]]=1;
			}
			dij();
			a[i][j]=dis[n];
		}
	}
	for(int i=1; i<=n; i++)
	{
		dp[i]=1e10;
		for(int j=0; j<i; j++)
		{
			dp[i]=min(dp[i],dp[j]+(a[j+1][i])*(i-j)+k);
		}//cout<<dp[i]-k<<" ";
	}
	cout<<dp[n]-k;
}
2024/7/15 14:26
加载中...