WA50 求助!
查看原帖
WA50 求助!
354310
Tnuzy_plzro楼主2023/3/28 15:34

rt,第一问就错了 qwq!!!

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n,m;
int s[15][15];
int vi[122];
int v[15],tot;
vector<int> g[122];
bool cor(int x,int y){
    return x>0&&x<=n&&y>0&&y<=m;
}
int hsh(pair<int,int> p){
    return (p.first-1)*m+p.second;
}
pair<int,int> rehsh(int h){
    return {(h/m)+1,h%m};
}
int dp[122][(1<<11)];
pair<int,int> pre[122][(1<<11)];
int kpr[122][(1<<11)];
int vis[122],w[122];
int Y;
void shr(int A){
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> Q;
	rep(i,1,Y)Q.push({dp[i][A],i}),vis[i]=0;
	while(!Q.empty()){
		int u=Q.top().second;Q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(auto v:g[u]){
			if(dp[u][A]+::w[v]<dp[v][A]){
				kpr[v][A]=u;
				dp[v][A]=dp[u][A]+::w[v];
				Q.push({dp[v][A],v});
			}
		}
	}
}
void dfs(int x,int y){
	vi[x]=1;
	if(!kpr[x][y]){
		if(pre[x][y]!=make_pair(0ll,0ll)){
			dfs(x,pre[x][y].first);
			dfs(x,pre[x][y].second);
		}
	}else{
		dfs(kpr[x][y],y);
	}
}
signed main(){
	memset(dp,63,sizeof dp);
    cin>>n>>m;Y=n*m;
    rep(i,1,n){
        rep(j,1,m){
            cin>>s[i][j];
            w[hsh({i,j})]=s[i][j];
            if(s[i][j]==0){
                v[tot++]=hsh({i,j});
                dp[hsh({i,j})][(1<<(tot-1))]=0;
            }
            if(cor(i-1,j)){
                g[hsh({i,j})].push_back(hsh({i-1,j}));
                g[hsh({i-1,j})].push_back(hsh({i,j}));
            }
            if(cor(i,j-1)){
                g[hsh({i,j})].push_back(hsh({i,j-1}));
                g[hsh({i,j-1})].push_back(hsh({i,j}));
            }
        }
    }
    int U=(1<<tot)-1;
    for(int i=1;i<=U;i++){
    	rep(k,1,Y){
    		for(int j=i&(i-1);j;j=i&(j-1)){
    			if(dp[k][j]+dp[k][j^i]<dp[k][i]){
    				pre[k][i]={j,j^i};
    				dp[k][i]=min(dp[k][i],dp[k][j]+dp[k][j^i]);
    			}
    		}
    	}shr(i);
    }int ans=1e9;
    int pos=0;
    rep(i,1,Y){
    	if(dp[i][U]<ans)
    	ans=min(ans,dp[i][U]),pos=i;
    }cout<<ans<<'\n';
	dfs(pos,U);
    rep(i,1,n){
    	rep(j,1,m){
    		if(s[i][j]==0){
    			cout<<'x';
    		}else if(vi[(i-1)*m+j]){
    			cout<<'o';
    		}else cout<<'_';
    	}cout<<'\n';
    }
}
2023/3/28 15:34
加载中...