首页 > 代码库 > http://poj.org/problem?id=2112_网络流
http://poj.org/problem?id=2112_网络流
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 #define MAX 300 9 #define INF 1000000010 int dis[MAX][MAX]; // 任意两点间的最短路径11 int map[MAX][MAX]; // 容量网络12 bool sign[MAX][MAX]; // 层次网络13 bool used[MAX]; // 标志数组14 int K, C, n, M;15 16 void Build_Graph(int min_max) {17 memset(map, 0, sizeof(map));18 for(int i=K+1; i<=n; i++) map[0][i] = 1;19 for(int i=1; i<=K; i++) map[i][n+1] = M;20 for(int i=K+1; i<=n; i++) {21 for(int j=1; j<=K; j++) {22 if(dis[i][j]<=min_max) map[i][j] = 1;23 }24 }25 }26 bool BFS() { // BFS构建层次网络27 // 初始化28 memset(used, 0, sizeof(used));29 memset(sign, 0, sizeof(sign));30 int queue[100*MAX] = {0};31 queue[0] = 0;32 used[0] = 1;33 int t = 1, f = 0;34 while(f<t) {35 for(int i=0; i<=n+1; i++) {36 if(!used[i]&&map[queue[f]][i]) {37 queue[t++] = i;38 used[i] = 1;39 sign[queue[f]][i] = 1;40 }41 }42 f++;43 }44 if(used[n+1]) return true;45 else return false;46 }47 int DFS(int v, int sum) {48 int s, t;49 if(v==n+1) return sum;50 s = sum;51 for(int i=0; i<=n+1; i++) {52 if(sign[v][i]) {53 t = DFS(i, min(map[v][i], sum));54 map[v][i] -= t;55 map[i][v] += t;56 sum -= t;57 }58 }59 return s-sum;60 }61 int main() {62 //freopen("test.txt", "r", stdin);63 int L, R, mid, ans;64 while(scanf("%d %d %d", &K, &C, &M)!=EOF) {65 n = K+C;66 // Floyd求任意两点间的最短距离67 for(int i=1; i<=n; i++) {68 for(int j=1; j<=n; j++) {69 scanf("%d", &dis[i][j]);70 if(dis[i][j]==0) dis[i][j] = INF;71 }72 }73 for(int k=1; k<=n; k++) {74 for(int i=1; i<=n; i++) {75 if(dis[i][k]!=INF) {76 for(int j=1; j<=n; j++) dis[i][j] = min(dis[i][k]+dis[k][j], dis[i][j]);77 }78 }79 }80 L = 0, R = 10000;81 82 // 二分法搜索83 while(L<R) {84 mid = (L+R)>>1;85 ans = 0;86 // Dinic法求最大流87 Build_Graph(mid); // 构建容量网络(残余网络)88 while(BFS()) ans += DFS(0, INF); // 构建层次网络,并进行DFS增广89 if(ans>=C) R = mid;90 else L = mid+1;91 }92 printf("%d\n", R);93 }94 return 0;95 }
贴板子。。。
http://poj.org/problem?id=2112_网络流
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。