80pts,dij+线性DP求条
查看原帖
80pts,dij+线性DP求条
803851
hualuo_2楼主2024/11/27 19:30

WA on #1,#2

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define fo(i,a,b) for(int i=a;i<=b;i++)

const int mn=205;
int co[mn][mn],f[mn];
int n,m,k,cnt,head[mn],tot=0;
bool pd[25][mn];
struct edge{
	int nxt,to,dis;
}e[mn<<1];
struct node{
	int w,now;
	bool operator < (const node &b) const
	{
		return w>b.w;		
	}
};

void add(int u,int v,int dis)
{
	e[++tot]={head[u],v,dis};
	head[u]=tot;
}

int len[mn];
bool vis[mn];

void dij()
{
	priority_queue<node> q;
 	len[1]=0;
	q.push((node){0,1});
	while(!q.empty())
	{
		node kk=q.top(); q.pop();
		int u=kk.now;
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(vis[v]) continue;
           // cout<<len[v]<<" "<<len[u]<<"\n";
			if(len[v]>len[u]+e[i].dis)
			{
				len[v]=len[u]+e[i].dis;
				// cout<<"release"<<"\n";
				q.push((node){len[v],v});
			}
		}
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin>>n>>m>>k>>cnt;
	fo(i,1,cnt)
	{
		int x,y,z; cin>>x>>y>>z;
		add(x,y,z); add(y,x,z);
	}
	int d; cin>>d;
	fo(i,1,d)
	{
		int p,a,b; cin>>p>>a>>b;
		fo(j,a,b) pd[p][j]=1;
	}
	fo(i,1,n)
	{
		fo(k,1,n)
		{
			fo(j,1,n) vis[j]=false,len[j]=INT_MAX;
			fo(r,i,k) fo(l,1,m) if(pd[l][r]) vis[l]=true;
			dij();
			co[i][k]=len[m];
			// cout<<len[m]<<"\n";
		}
	}
	// fo(i,1,n) 
	// {
	// 	fo(j,1,n)
	// 	{
	// 		cout<<co[i][j]<<" ";
	// 	}
	// }
	memset(f,0x7f,sizeof(f));
	fo(i,1,n)
	{
		f[i]=co[1][i]*i;
		for(int j=i-1;j>=0;j--)
		{
			f[i]=min(f[i],f[j]+co[j+1][i]*(i-j)+(!!j)*k);
		}
	}
	cout<<f[n];
	return 0;
}
2024/11/27 19:30
加载中...