标签:des style blog http color java os io strong
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2909 Accepted Submission(s):
942
#include<iostream>//网络流 #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<vector> #include<queue> #include<cmath> #define maxn 1<<29 using namespace std; struct edge { int from,to,cap,flow; }; vector<int>g[888]; vector<edge>edges; int m,n,ma; bool vis[888]; int d[888]; int cur[888]; int fl[444][444]; bool cc[444][444]; void init() { edges.clear(); int mm=m+n+1; for(int i=0;i<=mm;i++)g[i].clear(); } void add(int u,int v,int c) { edges.push_back((edge){u,v,c,0}); g[u].push_back(edges.size()-1); edges.push_back((edge){v,u,0,0}); g[v].push_back(edges.size()-1); } bool bfs(int s,int t) { memset(vis,0,sizeof(vis)); queue<int>q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); int size=g[u].size(); for(int i=0;i<size;i++) { edge &e=edges[g[u][i]]; if(!vis[e.to]&&e.cap>e.flow) { vis[e.to]=1; d[e.to]=d[u]+1; q.push(e.to); } } } return vis[t]; } int dfs(int u,int t,int mi) { if(u==t||mi==0)return mi; int flow=0,f; int size=g[u].size(); for(int &i=cur[u];i<size;i++) { edge &e=edges[g[u][i]]; if(d[u]+1==d[e.to]&&(f=dfs(e.to,t,min(mi,e.cap-e.flow)))>0) { e.flow+=f; edges[g[u][i]^1].flow-=f; flow+=f; mi-=f; if(mi==0)break; } } return flow; } int dinic(int s,int t) { int flow=0; while(bfs(s,t)) { memset(cur,0,sizeof(cur)); flow+=dfs(s,t,maxn); } return flow; } bool go() { for(int i=1;i<=n;i++) { int size=g[i].size(); for(int j=0;j<size;j++) { edge &e=edges[g[i][j]]; if(e.to>n&&e.to<=m+n) { //cout<<e.from<<" "<<e.to<<" "<<e.flow<<endl; fl[i][e.to-n]=e.flow; } } } memset(cc,0,sizeof(cc)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=j+1;k<=m;k++) { bool v1=0,v2=0; if(fl[i][j]!=ma&&fl[i][k]!=0) { if(cc[k][j])return true; v1=1; } if(fl[i][j]!=0&&fl[i][k]!=ma) { if(cc[j][k])return true; v2=1; } if(v1)cc[j][k]=1; if(v2)cc[k][j]=1; } } } return false; } int main() { int u,v,c; int s1,s2; while(scanf("%d%d%d",&n,&m,&ma)!=EOF) { init(); s1=s2=0; for(int i=1;i<=n;i++) { scanf("%d",&c); add(0,i,c); s1+=c; for(int j=1;j<=m;j++) { add(i,n+j,ma); } } for(int i=1;i<=m;i++) { scanf("%d",&c); add(n+i,m+n+1,c); s2+=c; } int ans=dinic(0,m+n+1); if(ans!=s1||ans!=s2)printf("Impossible\n"); else if(go())printf("Not Unique\n"); else { printf("Unique\n"); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { printf("%d",fl[i][j]); if(j==m)printf("\n"); else printf(" "); } } } } return 0; }
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> #include <numeric> using namespace std; typedef long long LL; const int MAXN = 510; const int MAXV = MAXN << 1; const int MAXE = 2 * MAXN * MAXN; const int INF = 0x3f3f3f3f; struct ISAP { int head[MAXV], cur[MAXV], gap[MAXV], dis[MAXV], pre[MAXV]; int to[MAXE], next[MAXE], flow[MAXE]; int n, ecnt, st, ed; void init(int n) { this->n = n; memset(head + 1, -1, n * sizeof(int)); ecnt = 0; } void add_edge(int u, int v, int c) { to[ecnt] = v; flow[ecnt] = c; next[ecnt] = head[u]; head[u] = ecnt++; to[ecnt] = u; flow[ecnt] = 0; next[ecnt] = head[v]; head[v] = ecnt++; } void bfs() { memset(dis + 1, 0x3f, n * sizeof(int)); queue<int> que; que.push(ed); dis[ed] = 0; while(!que.empty()) { int u = que.front(); que.pop(); gap[dis[u]]++; for(int p = head[u]; ~p; p = next[p]) { int v = to[p]; if(flow[p ^ 1] && dis[u] + 1 < dis[v]) { dis[v] = dis[u] + 1; que.push(v); } } } } int max_flow(int ss, int tt) { st = ss, ed = tt; int ans = 0, minFlow = INF; for(int i = 0; i <= n; ++i) { cur[i] = head[i]; gap[i] = 0; } bfs(); int u = pre[st] = st; while(dis[st] < n) { bool flag = false; for(int &p = cur[u]; ~p; p = next[p]) { int v = to[p]; if(flow[p] && dis[u] == dis[v] + 1) { flag = true; minFlow = min(minFlow, flow[p]); pre[v] = u; u = v; if(u == ed) { ans += minFlow; while(u != st) { u = pre[u]; flow[cur[u]] -= minFlow; flow[cur[u] ^ 1] += minFlow; } minFlow = INF; } break; } } if(flag) continue; int minDis = n - 1; for(int p = head[u]; ~p; p = next[p]) { int &v = to[p]; if(flow[p] && dis[v] < minDis) { minDis = dis[v]; cur[u] = p; } } if(--gap[dis[u]] == 0) break; ++gap[dis[u] = minDis + 1]; u = pre[u]; } return ans; } int stk[MAXV], top; bool sccno[MAXV], vis[MAXV]; bool dfs(int u, int f, bool flag) { vis[u] = true; stk[top++] = u; for(int p = head[u]; ~p; p = next[p]) if(flow[p]) { int v = to[p]; if(v == f) continue; if(!vis[v]) { if(dfs(v, u, flow[p ^ 1])) return true; } else if(!sccno[v]) return true; } if(!flag) { while(true) { int x = stk[--top]; sccno[x] = true; if(x == u) break; } } return false; } bool acycle() { memset(sccno + 1, 0, n * sizeof(bool)); memset(vis + 1, 0, n * sizeof(bool)); top = 0; return dfs(ed, 0, 0); } } G; int row[MAXN], col[MAXN]; int mat[MAXN][MAXN]; int n, m, k, ss, tt; void solve() { int sumr = accumulate(row + 1, row + n + 1, 0); int sumc = accumulate(col + 1, col + m + 1, 0); if(sumr != sumc) { puts("Impossible"); return ; } int res = G.max_flow(ss, tt); if(res != sumc) { puts("Impossible"); return ; } if(G.acycle()) { puts("Not Unique"); } else { puts("Unique"); for(int i = 1; i <= n; ++i) { for(int j = 1; j < m; ++j) printf("%d ", G.flow[mat[i][j]]); printf("%d\n", G.flow[mat[i][m]]); } } } int main() { while(scanf("%d%d%d", &n, &m, &k) != EOF) { for(int i = 1; i <= n; ++i) scanf("%d", &row[i]); for(int i = 1; i <= m; ++i) scanf("%d", &col[i]); ss = n + m + 1, tt = n + m + 2; G.init(tt); for(int i = 1; i <= n; ++i) G.add_edge(ss, i, row[i]); for(int i = 1; i <= m; ++i) G.add_edge(n + i, tt, col[i]); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { mat[i][j] = G.ecnt ^ 1; G.add_edge(i, n + j, k); } } solve(); } }
这类题目,这个作为模版哦!
Redraw Beautiful Drawings(hdu4888)网络流+最大流
标签:des style blog http color java os io strong
原文地址:http://www.cnblogs.com/yuyixingkong/p/3930844.html