80分求助
查看原帖
80分求助
987505
suym123楼主2024/7/29 10:44

第一个点和第四个点WA

#include <iostream>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q;
ll n,m,k,e1,inf=1e17,h[110],v[110],dis[110],c[25][110],dp[110],cnt;
struct edge
{
	ll to,next,d;
};
edge e[410];
void add(ll x,ll y,ll z)
{
	cnt++;
	e[cnt].to=y;
	e[cnt].d=z;
	e[cnt].next=h[x];
	h[x]=cnt;
}
ll dj(ll a,ll b)
{
	ll i,j;
	memset(v,0,sizeof(v));
	for(i=1;i<=m;i++)
	{
		for(j=a;j<=b;j++)
		{
			if(c[i][j]==1)
			{
				v[i]=1;
				break;
			}
		}
	}
	dis[1]=0;
	for(i=2;i<=m;i++) dis[i]=inf;
	q.push(make_pair(0,1));
	ll s1,s2;
	while(!q.empty())
	{
		s1=q.top().second;
		q.pop();
		if(v[s1]==1) continue;
		for(j=h[s1];j;j=e[j].next)
		{
			s2=e[j].to;
			if(v[s2]==0&&dis[s2]>dis[s1]+e[j].d)
			{
				dis[s2]=dis[s1]+e[j].d;
				q.push(make_pair(dis[s2],s2));
			}
		}
	}
	return dis[m];
}
int main()
{
	ll i,j,x,y,z,p,a,b,d;
	cin>>n>>m>>k>>e1;
	for(i=1;i<=e1;i++)
	{
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	cin>>d;
	for(i=1;i<=d;i++)
	{
		cin>>p>>a>>b;
		for(j=a;j<=b;j++)
		{
			c[p][j]=1;
		}
	}
	for(i=2;i<=n;i++) dp[i]=inf;
	for(i=2;i<=n;i++)
	{
		dp[i]=dj(1,i)*i;
		for(j=0;j<i;j++)
		{
			dp[i]=min(dp[i],dp[j]+dj(j+1,i)*(i-j)+k);
		}
	} 
	cout<<dp[n];
	return 0;
}
2024/7/29 10:44
加载中...