2 条题解

  • 0
    @ 2023-10-30 14:55:25
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110,M=210;
    const int inf=0x3f3f3f3f;
    struct node{
    	int x,y,c;
    }e[M];
    struct edge{
    	int x,y,c,pre;
    }a[2*M];
    int last[N],alen;
    void ins(int x,int y,int c){
    	a[++alen]=edge{x,y,c,last[x]};
    	last[x]=alen;
    }
    int vis[N][N],f[N];
    int d[N],v[N],st,ed;
    void spfa(){
    	memset(d,0x3f,sizeof(d));d[st]=0;
    	memset(v,0,sizeof(v));v[st]=1;
    	queue<int>Q;Q.push(st);
    	while(!Q.empty()){
    		int x=Q.front();Q.pop();
    		for(int k=last[x];k;k=a[k].pre){
    			int y=a[k].y;
    			if(d[y]>d[x]+a[k].c){
    				d[y]=d[x]+a[k].c;
    				if(!v[y]){
    					v[y]=1;
    					Q.push(y);
    				}
    			}
    		}
    		v[x]=0;
    	}
    }
    int main(){
    	int n,m,K,t;
    	scanf("%d%d%d%d",&n,&m,&K,&t);
    	for(int i=1;i<=t;i++){
    		scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c);
    	}
    	for(int i=1;i<=m;i++){
    		for(int j=1;j<=n;j++){
    			vis[i][j]=1;
    		}
    	}
    	int q;scanf("%d",&q);
    	for(int i=1;i<=q;i++){
    		int x,l,r;
    		scanf("%d%d%d",&x,&l,&r);
    		for(int j=l;j<=r;j++){
    			vis[x][j]=0;
    		}
    	}
    	st=1,ed=m;
    	memset(f,0x3f,sizeof(f));
    	f[0]=0;
    	for(int i=1;i<=n;i++){
    		int mn=inf;
    		for(int j=0;j<i;j++){
    			alen=1;memset(last,0,sizeof(last));
    			for(int k=1;k<=t;k++){
    				int x=e[k].x,y=e[k].y,c=e[k].c;
    				int bk=0;
    				for(int l=j+1;l<=i;l++){
    					if(!vis[x][l]||!vis[y][l]){
    						bk=1;
    						break;
    					}
    				}
    				if(!bk){
    					ins(x,y,c),ins(y,x,c);
    				}
    			}
    			spfa(); 
    			if(d[ed]!=inf){
    				mn=min(mn,f[j]+d[ed]*(i-j)+K);
    			}
    		}
    		f[i]=mn;
    	}
    	printf("%d",f[n]-K);
    	return 0;
    }
    
    • -1
      @ 2023-8-25 18:40:46
      #include<bits/stdc++.h>
      namespace zjy
      {
          inline void read(int &x)
      	{
          	x=0;int f=1;char ch=getchar();
          	while(ch<'0'||ch>'9')
      		{
      			if(ch=='-')
      			{
      				f=-1;
      				ch=getchar();
      			}
      		}
          	while(ch>='0'&&ch<='9')
      		{
      			x=x*10+ch-'0';
      			ch=getchar();
      		}
          	x*=f;
          }
      		struct EDGE
      	{
          	int nex,w,to;
      	}edge[410];
      	int head[21],tot,dis[21];
      	inline void insert(int from,int to,int w)
      	{
          	edge[++tot].nex=head[from];
          	head[from]=tot;
          	edge[tot].to=to;
          	edge[tot].w=w;
      	}
      	struct POINT
      	{
          	int num;
          	friend bool operator < (POINT a,POINT b)
      		{
              	return dis[a.num]<dis[b.num];
          	}
      	}point[21];
      	int N,M,K,E,D;
      	bool close[21][105],vis[21];
      	int cost[105][105];
      	std::priority_queue<std::pair<int,int> > que;
      	void dijkstra(int l,int r)
      	{
         		memset(dis,0x3f,sizeof(dis));
          	memset(vis,0,sizeof(vis));
          	for(int x=1;x<=M;x++)
              	for(int i=l;i<=r;i++)
                  	if(close[x][i])
      				{
                      	vis[x]=1;
                      	continue;
                  	}   
          	que.push(std::make_pair(0,1));dis[1]=0;
          	while(!que.empty())
      		{
              	int u=que.top().second;
              	que.pop();
              	if(vis[u])
                  	continue ;
              	vis[u]=1;
              	for(int i=head[u];i;i=edge[i].nex)
      			{
                  	if(dis[edge[i].to]>dis[u]+edge[i].w)
      				{
                      	dis[edge[i].to]=dis[u]+edge[i].w;
                      	que.push(std::make_pair(-dis[edge[i].to],edge[i].to));
                  	}
             		}
          	}
          	cost[l][r]=dis[M];
      		}
      	int dp[105];
      	int work()
      	{
          	read(N);read(M);read(K);read(E);
          	int x,y,z;
          	for(int i=1;i<=E;i++)
      		{
              	read(x);read(y);read(z);
              	insert(x,y,z);
              	insert(y,x,z);
          	}
          	read(D);
          	for(int i=1;i<=D;i++)
      		{
              	read(x);read(y);read(z);
              	for(int i=y;i<=z;i++)
                  	close[x][i]=1;
          	}
          	for(int i=1;i<=N;i++)
              	for(int j=i;j<=N;j++)
                  	dijkstra(i,j);
          	memset(dp,0x3f,sizeof(dp));
          	dp[0]=-K;
          	for(int i=1;i<=N;i++)
              	for(int j=0;j<=i;j++)
                  	if(cost[j+1][i]!=0x3f3f3f3f&&dp[j]!=0x3f3f3f3f)
                      	dp[i]=std::min(dp[i],dp[j]+(i-j)*cost[j+1][i]+K);
          	std::cout<<dp[N];
          	return 0;
      	}
      }
      int main()
      {
          zjy::work();
          return 0;
      }
      
      
      • 1

      信息

      ID
      1003
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      95
      已通过
      45
      上传者