POJ 3436 ACM Computer Factory 最大流

本文详细解析了一个ACM竞赛中的计算机工厂问题,通过构建最大流网络模型解决流水线上的电脑组装问题,实现最大组装数量的计算并输出流水线状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACM Computer Factory

 题意:一个公司有 n 个机器, 现在一个电脑有 p 个组件,每个机器一分钟能够处理Qi个电脑,前p个数代表的是每个位置的零件的状态 0 代表的是进入到这个机器的电脑 这个位置的零件不能存在 1 代表这个位置的零件一定要有,2代表这个位置的零件可以有也可以没有。 后p个数代表的是,电脑从这个机器出去之后的状态,0代表这个位置没有零件 1代表这个位置有零件。

现在求最大组装电脑的数量,并且要输出流水线状态。

代码跑一下最大流,然后对于每一个正边的流量使用的流量就是反边的流量。

代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 using namespace std;
  5 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
  6 #define LL long long
  7 #define ULL unsigned LL
  8 #define fi first
  9 #define se second
 10 #define pb push_back
 11 #define lson l,m,rt<<1
 12 #define rson m+1,r,rt<<1|1
 13 #define lch(x) tr[x].son[0]
 14 #define rch(x) tr[x].son[1]
 15 #define max3(a,b,c) max(a,max(b,c))
 16 #define min3(a,b,c) min(a,min(b,c))
 17 typedef pair<int,int> pll;
 18 const int inf = 0x3f3f3f3f;
 19 const LL INF = 0x3f3f3f3f3f3f3f3f;
 20 const LL mod =  (int)1e9+7;
 21 
 22 const int N = 200;
 23 const int M = N*N;
 24 int n, m, k;
 25 int in[N][15], out[N][15], Q[N];
 26 
 27 int head[N], deep[N], cur[N];
 28 int w[M], to[M], nx[M];
 29 int tot;
 30 void add(int u, int v, int val){
 31     w[tot]  = val; to[tot] = v;
 32     nx[tot] = head[u]; head[u] = tot++;
 33 
 34     w[tot] = 0; to[tot] = u;
 35     nx[tot] = head[v]; head[v] = tot++;
 36 }
 37 int bfs(int s, int t){
 38     queue<int> q;
 39     memset(deep, 0, sizeof(deep));
 40     q.push(s);
 41     deep[s] = 1;
 42     while(!q.empty()){
 43         int u = q.front();
 44         q.pop();
 45         for(int i = head[u]; ~i; i = nx[i]){
 46             if(w[i] > 0 && deep[to[i]] == 0){
 47                 deep[to[i]] = deep[u] + 1;
 48                 q.push(to[i]);
 49             }
 50         }
 51     }
 52     return deep[t] > 0;
 53 }
 54 int Dfs(int u, int t, int flow){
 55     if(u == t) return flow;
 56     for(int &i = cur[u]; ~i; i = nx[i]){
 57         if(deep[u]+1 == deep[to[i]] && w[i] > 0){
 58             int di = Dfs(to[i], t, min(w[i], flow));
 59             if(di > 0){
 60                 w[i] -= di, w[i^1] += di;
 61                 return di;
 62             }
 63         }
 64     }
 65     return 0;
 66 }
 67 
 68 int Dinic(int s, int t){
 69     int ans = 0, tmp;
 70     while(bfs(s, t)){
 71         for(int i = s; i <= t; i++) cur[i] = head[i];
 72         while(tmp = Dfs(s, t, inf)) ans += tmp;
 73     }
 74     return ans;
 75 }
 76 void init(){
 77     memset(head, -1, sizeof(head));
 78     tot = 0;
 79 }
 80 int p;
 81 bool check(int x, int y){
 82     for(int i = 1;i <= p; i++){
 83         if(in[y][i] == 0 && out[x][i] == 1)  return false;
 84         if(in[y][i] == 1 && out[x][i] == 0)  return false;
 85     }
 86     return true;
 87 }
 88 int au[M], av[M], aw[M];
 89 int main(){
 90     while(~scanf("%d%d", &p, &n)){
 91         init();
 92         for(int i = 1; i <= n; i++){
 93             scanf("%d", &Q[i]);
 94             add(i, i+n, Q[i]);
 95             for(int j = 1; j <= p; j++)
 96                 scanf("%d", &in[i][j]);
 97             for(int j = 1; j <= p; j++)
 98                 scanf("%d", &out[i][j]);
 99         }
100         int s = 0, t = n*2 + 1;
101         for(int i = 1; i <= n; i++){
102             int f = 0;
103             for(int j = 1; j <= p; j++){
104                 if(in[i][j] != 2) f += in[i][j];
105             }
106             if(f == 0) add(s, i, inf);
107             f = 0;
108             for(int j = 1; j <= p; j++)
109                 f += out[i][j];
110             if(f == p) add(i+n, t, inf);
111         }
112         for(int i = 1; i <= n; i++){
113             for(int j = 1; j <= n; j++){
114                 if(i != j && check(i, j))
115                     add(i+n, j, inf);
116             }
117         }
118 
119         printf("%d ", Dinic(s, t));
120 
121         int top = 0;
122         for(int i = 1; i <= n; i++){
123             for(int j = head[i]; ~j; j = nx[j]){
124                 if(j & 1 && w[j] != 0 && to[j] != s){
125                     top +=  1;
126                     au[top] = to[j] - n;
127                     av[top] = i;
128                     aw[top] = w[j];
129                 }
130 
131             }
132         }
133         printf("%d\n", top);
134         for(int i = 1; i <= top; i++)
135             printf("%d %d %d\n", au[i], av[i], aw[i]);
136     }
137     return 0;
138 }
View Code

 

转载于:https://www.cnblogs.com/MingSD/p/9721493.html

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值