样例对全wa求调
查看原帖
样例对全wa求调
1415958
BeyondChrist楼主2025/7/31 10:07
#include<iostream>
#include<cstring>
#include<vector>
#define maxx 0x3f3f3f3f
using namespace std;
int c,n,m,s,w,t;
struct crossing{
	int s,w,t;
}cr[25][25];
struct point{
	int x,y,w;
};
int dis[45][45];
bool vis[45][45];
vector<point> p[45][45];
void build(){
	for(int i=0;i<2*n;i++){
		for(int j=1;j<2*m;j+=2){
			p[i][j].push_back({i,j+1,2});
			p[i][j+1].push_back({i,j,2});
		}
		for(int j=0;j<2*m;j+=2){
			p[i][j].push_back({i,j+1,-1});
			p[i][j+1].push_back({i,j,-1});
		}
	}
	for(int j=0;j<2*m;j++){
		for(int i=0;i<2*n;i+=2){
			p[i][j].push_back({i+1,j,-1});
			p[i+1][j].push_back({i,j,-1});
		}
		for(int i=1;i<2*n;i+=2){
			p[i][j].push_back({i+1,j,2});
			p[i+1][j].push_back({i,j,2});
		}
	}
}
void update(int x1,int y1,int x2,int y2,int &weight){
	int s=cr[x1/2][y1/2].s,w=cr[x1/2][y1/2].w;
	int neww=0;
	if(dis[x1][y1]>=cr[x1/2][y1/2].t){
		neww=(dis[x1][y1]-cr[x1/2][y1/2].t)%(s+w);
	}
	else{
		//neww=(cr[x1/2][y1/2].t-dis[x1][y1])%(s+w);
		neww=((s+w)-(cr[x1/2][y1/2].t-dis[x1][y1])%(s+w))%(s+w);
	}
	if(x1==x2){
		if(neww>=s){
			weight=1;
			return;
		}
		else{
			weight=s-neww+1;
			return;
		}
	}
	if(y1==y2){
		if(neww>=s){
			weight=w-neww+s+1;
			return;
		}
		else{
			weight=1;
			return;
		}
	}
}
void dj(){
	for(int i=0;i<2*n;i++){
		for(int j=0;j<2*m;j++){
			int q=0,w=0,mind=maxx;
    		for(int k=0;k<2*n;k++){
    			for(int l=0;l<2*m;l++){
    				if(!vis[k][l]&&dis[k][l]<mind){
    					q=k,w=l;
						mind=dis[k][l];
					} 
				}
			}	
    		vis[q][w]=true;
    		//for(auto ed:p[q][w]){
    		for(int o=0;o<p[q][w].size();o++){
    			/*if(ed.w==-1){
    				update(q,w,ed.x,ed.y,ed.w);
				}
    			if(dis[ed.x][ed.y]>dis[q][w]+ed.w){
    				dis[ed.x][ed0.y]=dis[q][w]+ed.w;	
				}*/
				if(p[q][w][o].w==-1){
					update(q,w,p[q][w][o].x,p[q][w][o].y,p[q][w][o].w);
				}
				if(dis[p[q][w][o].x][p[q][w][o].y]>dis[q][w]+p[q][w][o].w){
					dis[p[q][w][o].x][p[q][w][o].y]=dis[q][w]+p[q][w][o].w;
				}
    		}
  		}
	}
}
int main(){
	cin>>c;
	for(int u=1;u<=c;u++){
		for(int i=0;i<2*n;i++){
			for(int j=0;j<2*m;j++){
				p[i][j].clear();
			}
		}
		memset(cr,0,sizeof(cr));
		memset(dis,maxx,sizeof(dis));
		memset(vis,0,sizeof(vis));
		cin>>n>>m;
		build();
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>s>>w>>t;
				cr[i][j]={s,w,t};
			}
		}
		//vis[0][0]=1;
		dis[0][0]=0;
		dj();
//		for(int i=0;i<2*n;i++){
//			for(int j=0;j<2*m;j++){
//				cout<<dis[i][j]<<" ";
//			}
//			cout<<endl;
//		}
		cout<<"Case #"<<u<<": ";
		cout<<dis[2*n-1][2*m-1];
		putchar('\n');
	}
	return 0;
}

用的是dijkstra+动态更改权值跑最短路,具体看代码

2025/7/31 10:07
加载中...