CodeForces 152E
来源:互联网 发布:java 变量类型 编辑:程序博客网 时间:2024/06/14 02:43
斯坦纳树+输出方案
#include<cstdio>#include<iostream>#include<cstring>const int N=210;const int INF=1e9;int tot;int g[N][N];int mp[N][N];int val[N];int mi[N][N];void flody(){ memset(mi,-1,sizeof(mi)); for(int k=0;k<tot;k++){ for(int i=0;i<tot;i++){ for(int j=0;j<tot;j++){ //g[i][j]=min(g[i][j],g[i][k]+g[k][j]-val[k]); if(g[i][k]+g[k][j]-val[k]<g[i][j]){ g[i][j]=g[i][k]+g[k][j]-val[k]; mi[i][j]=k; } } } }}int vis[N];int s[N];int dp[N][1<<7];int pre[N][1<<7][2];int n,m,K;void stn(){ int cnt=0; for(int i=0;i<tot;i++){ if(vis[i]){ //printf("%d %d\n",i/m+1,i%m+1); s[i]=1<<cnt; cnt++; } else s[i]=0; } memset(dp,0x3f,sizeof(dp)); for(int i=0;i<tot;i++){ dp[i][s[i]]=val[i]; } memset(pre,-1,sizeof(pre)); int ed=1<<cnt; for(int i=1;i<ed;i++){ for(int j=0;j<tot;j++){ for(int k=(i-1)&i;k;k=(k-1)&i){ //dp[j][i]=min(dp[j][i],dp[j][k|s[j]]+dp[j][i^k|s[j]]-val[j]); int x=dp[j][k|s[j]],y=dp[j][i^k|s[j]]; if(dp[j][i]>x+y-val[j]){ dp[j][i]=x+y-val[j]; pre[j][i][0]=j; pre[j][i][1]=k|s[j]; } } } for(int j=0;j<tot;j++){ for(int j1=0;j1<tot;j1++){ //dp[j1][i|s[j1]]=min(dp[j1][i|s[j1]],dp[j][i]+val[j1]); if(dp[j][i]+g[j][j1]-val[j]<dp[j1][i|s[j1]]){ dp[j1][i|s[j1]]=dp[j][i]+g[j][j1]-val[j]; pre[j1][i|s[j1]][0]=j; pre[j1][i|s[j1]][1]=i; } } } }}int aa[N][N];int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int check(int i,int j){ if(i<1||i>n||j<1||j>m)return 0; return 1;}int ans[N][N];void _find(int x,int y){ int m1=mi[x][y]; ans[x/m+1][x%m+1]=1; ans[y/m+1][y%m+1]=1; if(m1!=-1){ _find(x,m1); _find(m1,y); }}void dfs(int id,int st){ int x=pre[id][st][0],y=pre[id][st][1]; ans[id/m+1][id%m+1]=1; if(x==-1)return ; if(x==id){ dfs(x,y|s[id]); dfs(x,st^y|s[id]); } else { _find(x,id); dfs(x,y); }}int main(){ #ifdef DouBi freopen("in.cpp","r",stdin); #endif // DouBi while(scanf("%d%d%d",&n,&m,&K)!=EOF){ tot=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ mp[i][j]=tot; scanf("%d",&val[tot++]); } } memset(g,0x3f,sizeof(g)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ g[mp[i][j]][mp[i][j]]=val[mp[i][j]]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ for(int k=0;k<4;k++){ int ii=i+dir[k][0],jj=j+dir[k][1]; if(check(ii,jj)){ g[mp[i][j]][mp[ii][jj]]=val[mp[i][j]]+val[mp[ii][jj]]; } } } } flody();// for(int i=0;i<tot;i++){// for(int j=0;j<tot;j++){// printf("%d ",g[i][j]);// }printf("\n");// } memset(vis,0,sizeof(vis)); for(int i=0;i<K;i++){ int a,b;scanf("%d%d",&a,&b); vis[mp[a][b]]=1; } stn(); int ed=1<<K; int id=-1,ans1=INF; for(int i=0;i<tot;i++){ if(dp[i][ed-1]<ans1){ ans1=dp[i][ed-1]; id=i; } } printf("%d\n",ans1); memset(ans,0,sizeof(ans)); dfs(id,ed-1); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%c",ans[i][j]?'X':'.'); }printf("\n"); } } return 0;}
0 0
- CodeForces 152E
- codeforces 152E bfs+状态压缩
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- Codeforces 124 E
- Codeforces 231E
- Codeforces 231E - Cactus
- Codeforces #163 Div2 E
- codeForces 35E
- Codeforces 35E
- Playlist codeforces 268E
- Codeforces 148E(Porcelain)
- codeforces round#177 E
- codeforces 203E Transportation
- CodeForces 254 E Dormitory
- codeforces日记371e
- Spring batch基础一
- 【玲珑杯 1047】【二分匹配 KM算法或者费用流】Best couple【定义男女生的距离为最短距离,求匹配之后使得总距离最大】
- 基于Agera的EventBus实现库
- poj 3020 Antenna Placement
- 169. Majority Element
- CodeForces 152E
- jquery遍历表格获取表格当前行数据
- 浅谈CSS外边距合并
- UbuntuServer安装tomcat与初始化设置(命令行)
- android知识回顾-------使用到的设计模式及举例
- Atitit 基于图片图像 与文档混合文件夹的分类
- First day
- 1622-5 孔富晨 总结《2016年11月8日》 【连续第39天总结】
- 【11.8】P73 T3