为什么会错?
查看原帖
为什么会错?
1037981
封禁用户楼主2024/7/22 18:02
#include<bits/stdc++.h>
using namespace std;
const int N=50,M=15;
bool vis[N][M];
int r,c,wat[N][N],X[N][N],fdis[N][N];
int n,f[1<<M][M],dist[M][M];
int way[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int> > > > q;
void gm(int &a,int b){
	a=min(a,b);
}
void dfs(int x,int y){
	if(!(x>=0&&x<r&&y>=0&&y<c)||wat[x][y]||vis[x][y]) return ;
	vis[x][y]=true;
	X[x][y]=n;
	for(int i=0;i<4;i++)
	  dfs(x+way[i][0],y+way[i][1]);
}
void dijkstra(int t){
	memset(vis,false,sizeof(vis));
	memset(fdis,0x3f,sizeof(fdis));
	int x,y,xx,yy,fd;
	for(x=0;x<r;x++){
		for(y=0;y<c;y++){
			if(X[x][y]==t){
				fdis[x][y]=0;
				q.push(make_pair(0,make_pair(x,y)));
			}
		}
	}
	while(!q.empty()){
		x=q.top().second.first;
		y=q.top().second.second;
		q.pop();
		if(vis[x][y]) continue;
		vis[x][y]=true;
		fd=fdis[x][y];
		if(!wat[x][y]) gm(dist[t][X[x][y]],fd);
		for(int i=0;i<4;i++){
			xx=x+way[i][0];
			yy=y+way[i][1];
			if(xx>=0&&xx<r&&yy>=0&&yy<c&&wat[xx][yy]>=0&&fd+wat[xx][yy]<fdis[xx][yy]){
				fdis[xx][yy]=fd+wat[xx][yy];
				q.push(make_pair(fdis[xx][yy],make_pair(xx,yy)));
			}
		}
	}
}
int main(){
	memset(dist,0x3f,sizeof(dist));
	char w;
	cin>>r>>c;
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			cin>>w;
			if(w=='S') wat[i][j]=1;
			else if(w=='.') wat[i][j]=-1;
		}
	}
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			if(wat[i][j]) X[i][j]=-1;
			else if(!vis[i][j]){
				dfs(i,j);
				n++;
			}
		}
	}
	for(int i=0;i<n;i++) dijkstra(i);
	memset(f,0x3f,sizeof(f));
	int ans=INT_MAX,maxx=1<<n;
	for(int i=0;i<n;i++) f[1<<i][i]=0;
	for(int i=1;i<maxx;i++){
		for(int j=0;j<n;j++){
			if(f[i][j]!=1061109567){
				for(int k=0;k<n;k++){
					if(!(i&(1<<k))){
						gm(f[i|(1<<k)][k],f[i][j]+dist[j][k]);
					}
				}
			}
		}
	}
	maxx--;
	for(int i=0;i<n;i++){
		gm(ans,f[maxx][i]);
	}
	cout<<ans;
}
2024/7/22 18:02
加载中...