BZOJ_P1475 方格取数(网络流)
2016-03-13 13:12
351 查看
BZOJ传送门
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 713 Solved: 362
[Submit][Status][Discuss]
Description
在一个n*n的方格里,每个格子里都有一个正整数。从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大。
Input
第一行一个数n;(n<=30) 接下来n行每行n个数描述一个方阵
Output
仅一个数,即最大和
Sample Input
2
1 2
3 5
Sample Output
6
HINT
Source
最小独立集
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 713 Solved: 362
[Submit][Status][Discuss]
Description
在一个n*n的方格里,每个格子里都有一个正整数。从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大。
Input
第一行一个数n;(n<=30) 接下来n行每行n个数描述一个方阵
Output
仅一个数,即最大和
Sample Input
2
1 2
3 5
Sample Output
6
HINT
Source
最小独立集
#include<cstdio> #include<climits> #include<cstring> #include<queue> #include<vector> #include<iostream> using namespace std; #define N 35 #define INF INT_MAX/3*2 struct Min_Cut{ struct Edge{ int fr,to,cap,flow; Edge(int f,int t,int c,int fl):fr(f),to(t),cap(c),flow(fl){} }; vector<Edge> edge;vector<int> g[N*N]; int n,m,flow,total,S,T;int p[N*N],a[N*N],w ; int hash(int x,int y){return (x-1)*n+y;} void Add_Edge(int fr,int to,int cap){ edge.push_back(Edge(fr,to,cap,0)); edge.push_back(Edge(to,fr,0,0)); int t=edge.size(); g[fr].push_back(t-2);g[to].push_back(t-1); return; } int in(){ int x=0;char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x; } void init(){ n=in(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ w[i][j]=in(); total+=w[i][j]; } S=0,T=n*n+1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if((i+j)&1) Add_Edge(hash(i,j),T,w[i][j]); else{ Add_Edge(S,hash(i,j),w[i][j]); if(i>1) Add_Edge(hash(i,j),hash(i-1,j),INF); if(i<n) Add_Edge(hash(i,j),hash(i+1,j),INF); if(j>1) Add_Edge(hash(i,j),hash(i,j-1),INF); if(j<n) Add_Edge(hash(i,j),hash(i,j+1),INF); } } return; } int Max_Flow(int s,int t){ for(;;){ memset(a,0,sizeof(a)); queue<int> q; q.push(s);a[s]=INT_MAX; while(!q.empty()){ int x=q.front();q.pop(); for(int i=0;i<g[x].size();i++){ Edge& e=edge[g[x][i]]; if(!a[e.to]&&e.cap>e.flow){ p[e.to]=g[x][i]; a[e.to]=min(a[x],e.cap-e.flow); q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(int u=t;u!=s;u=edge[p[u]].fr){ edge[p[u]].flow+=a[t]; edge[p[u]^1].flow-=a[t]; } flow+=a[t]; } return flow; } void solve(){ init();Max_Flow(S,T); printf("%d\n",total-flow); } }s; int main(){ s.solve(); return 0; }
相关文章推荐
- TCP和UDP的区别
- TCP/IP之四书五经
- Eclipse调错——Type The type javax.servlet.http.HttpServletRequest cannot be res...
- rtp over tcp
- http协议状态码总结
- HttpSession
- 电脑网络诊断
- Linux服务器上监控网络带宽的18个常用命令
- socket tcp使用recv接收数据时,返回errno错误代码88
- socket tcp使用recv接收数据时,返回errno错误代码88
- 关于火车头网络爬虫的几个常见问题
- 简单的调用本地服务器播放网络视频
- 简单的调用本地服务器播放网络视频
- 网络模型与协议
- TCP套接字的数据传输
- TCP文件传送
- bzoj 1491: [NOI2007]社交网络
- Android之利用HTTP网络通信实现与PHP的交互(三)
- 深入理解HTTP协议(三)——深入了解篇Cookie和Session
- Nginx(二):HTTP服务的相关配置