初始化极大值
查看原帖
初始化极大值
242473
Elegy_of_Green_Kite楼主2022/9/12 09:40
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define CI const int
#define int long long
using namespace std;
const int N=1e3+5,M=1e4+5,inf=2e9+5;
int n,m,k,e,d,dp[N],cant_vis[N],cl[N][N],co[N][N];
int tot,head[N],Next[M],vet[M],len[M];
int dis[N],vis[N];
struct node
{
	int u,v;
	node(){}
	node(CI& a,CI& b):u(a),v(b){}
	bool operator<(const node& x)const{ return dis[x.u]<dis[u]; }
};
int read(int &v)
{
	int f=1; char ch;
	for(ch='*';!isdigit(ch) && ch!='-';ch=getchar());
	if(ch=='-')  f=-1,ch=getchar();
	for(v=0;isdigit(ch);v=v*10+ch-'0',ch=getchar());
	v*=f;
return v;
}
void add(int a,int b,int c)
{
	Next[++tot]=head[a];
	vet[tot]=b;
	len[tot]=c;
	head[a]=tot;
}
void dij()
{
	priority_queue<node> q;
	fill(dis+1,dis+1+m,inf);
	fill(vis+1,vis+1+m,0);
	dis[1]=0,q.push(node(1,0));
	while(!q.empty())
	{
		int u=q.top().u; q.pop();
		if(vis[u])  continue;
		vis[u]=1;
		for(int i=head[u];~i;i=Next[i])
		{
			int v=vet[i];
			if(cant_vis[v])  continue;
			if(dis[v]>dis[u]+len[i])
			{
				dis[v]=dis[u]+len[i];
				if(!vis[v])  q.push(node(v,dis[v]));
			}
		}
	}
}
signed main()
{
	tot=-1,memset(head,-1,sizeof(head));
	read(n),read(m),read(k),read(e);
	for(int i=1;i<=e;i++)
	{
		int u,v,w;
		read(u),read(v),read(w);
		add(u,v,w),add(v,u,w);
	}
	read(d);
	for(int i=1;i<=d;i++)
	{
		int t,x,y;
		read(t),read(x),read(y);
		for(int j=x;j<=y;j++)  cl[t][j]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			fill(cant_vis+1,cant_vis+1+m,0);
			for(int r=i;r<=j;r++)
				for(int l=1;l<=m;l++)
					if(cl[l][r])  cant_vis[l]=1;
			dij(),co[i][j]=dis[m];
		}
	fill(dp+1,dp+1+n,inf);
	for(int i=1;i<=n;i++)
	{
		dp[i]=co[1][i]*i;
		for(int j=i-1;j>=0;j--)
			dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
	}
	printf("%lld",dp[n]);
return 0;
}

上面的是 AC 代码,但是之前我把infinf 改成 101810^{18} 就一直 80 pts80\ pts,强烈怀疑是 disdisdpdp 数组的锅,但是为什么呢?

代码参(chao)考(xi)第一篇题解的,开头加了 #define int long long

2022/9/12 09:40
加载中...