消圈算法c语言,费用流消圈算法(构造残量网络)

#include #include#include#include#include#include#include#include

#define MEM(a,x) memset(a,x,sizeof a)

#define eps 1e-8

#define MOD 10009

#define INF 100000000

#define ll __int64

#define bug cout<

#define fread freopen("ceshi.txt","r",stdin)

#define fwrite freopen("out.txt","w",stdout)

using namespacestd;structEdge

{intto,next,cost;

}edge[100000];intn,m;int head[300],tol;void addedge(int u,int v,intcost)

{

edge[tol].to=v;

edge[tol].cost=cost;

edge[tol].next=head[u];

head[u]=tol++;

}int x[110][3],y[110][3],sum[110],ans[110][110];int pre[300],vis[300],num[300],dis[300];//pre记录负环,num入队列的次数,spfa返回最先入队>n的点

int len[110][110];int spfa(int s,intn)

{

queueq;

MEM(vis,0);

MEM(num,0);for(int i=0;i

dis[i]=INF;

q.push(s);

vis[s]=1;

num[s]++;

dis[s]=0;while(!q.empty())

{int u=q.front();

q.pop();

vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next)

{int v=edge[i].to;if(dis[u]+edge[i].cost

{

dis[v]=dis[u]+edge[i].cost;

pre[v]=u;if(!vis[v])

{

vis[v]=1;

q.push(v);if(++num[v]>n) returnv;

}

}

}

}return -1;

}intmain()

{//fread;//int n,m;

while(scanf("%d%d",&n,&m)!=EOF)

{for(int i=0;i

scanf("%d%d%d",&x[i][0],&x[i][1],&x[i][2]);for(int i=0;i

scanf("%d%d%d",&y[i][0],&y[i][1],&y[i][2]);

MEM(head,-1);

tol=0;int s=n+m;//汇点

for(int i=0;i

{for(int j=0;j

{

len[i][j]=abs(x[i][0]-y[j][0])+abs(x[i][1]-y[j][1])+1;

addedge(i,j+n,len[i][j]);

}

}

MEM(sum,0);for(int i=0;i

{for(int j=0;j

{

scanf("%d",&ans[i][j]);if(ans[i][j]!=0) addedge(j+n,i,-len[i][j]);

sum[j]+=ans[i][j];

}

}for(int i=0;i

{if(sum[i]0) addedge(s,i+n,0);

}int id=spfa(s,s+1);if(id==-1) puts("OPTIMAL");else{

puts("SUBOPTIMAL");int st=id;

MEM(vis,0);while(1)

{if(!vis[st])

{

vis[st]=1;

st=pre[st];

}else{

id=st;break;

}

}do{int u=pre[st],v=st;if(u=n&&v=n&&u

st=pre[st];

}while(st!=id);for(int i=0;i

{

printf("%d",ans[i][0]);for(int j=1;j

printf("%d",ans[i][j]);

puts("");

}

}

}return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GS(Gauss-Seidel)迭代算法是一种求解线性方程组的方,在c语言中的实现可以参考以下示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX_ITER 1000 // 最大迭代次数 #define TOL 1.0e-12 // 精度要求 int main() { int n = 3; // 线性方程组的阶数 int i, j, k; int iter = 0; // 迭代次数 double** A; // 系数矩阵 double* b; // 常数向量 double* x; // 解向量 double* x_new; // 新解向量 double resid; // 残量 // 分配内存 A = (double**)malloc(n * sizeof(double*)); for (i = 0; i < n; i++) { A[i] = (double*)malloc(n * sizeof(double)); } b = (double*)malloc(n * sizeof(double)); x = (double*)malloc(n * sizeof(double)); x_new = (double*)malloc(n * sizeof(double)); // 初始化系数矩阵和常数向量 A[0][0] = 2; A[0][1] = 1; A[0][2] = -1; b[0] = 8; A[1][0] = -3; A[1][1] = -1; A[1][2] = 2; b[1] = -11; A[2][0] = -2; A[2][1] = 1; A[2][2] = 2; b[2] = -3; // 初始化解向量 for (i = 0; i < n; i++) { x[i] = 0.0; x_new[i] = 0.0; } // 迭代求解 do { iter++; for (i = 0; i < n; i++) { x_new[i] = b[i]; for (j = 0; j < n; j++) { if (i != j) { x_new[i] -= A[i][j] * x_new[j]; } } x_new[i] /= A[i][i]; } resid = 0.0; for (k = 0; k < n; k++) { resid += fabs(x_new[k] - x[k]); x[k] = x_new[k]; } } while (resid > TOL && iter < MAX_ITER); // 输出结果 printf("Solution:\n"); for (i = 0; i < n; i++) { printf("x%d = %.14f\n", i+1, x[i]); } printf("Iterations: %d\n", iter); // 释放内存 for (i = 0; i < n; i++) { free(A[i]); } free(A); free(b); free(x); free(x_new); return 0; } ``` 这段代码通过一个具体的线性方程组的例子演示了GS迭代算法的求解过程,其中MAX_ITER和TOL分别表示最大迭代次数和精度要求,A是系数矩阵,b是常数向量,x是解向量,x_new是新解向量,resid是残量。在迭代过程中,首先通过一次循环计算出新解向量,然后计算残量,如果满足精度要求或者迭代次数已达到最大值,则结束迭代。最后输出求解结果和迭代次数,并释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值