P_poker 2022-05-19 17:26 采纳率: 100%
浏览 92
已结题

网络流算法,最小费用最大流问题

img


设有一个给定的网络N(V,x,y,A,C,w),其中c表示弧容量,w表示弧上的单位费用,另外给定一个常数a>o,请设计一个算法,用于求该网络中一个费用不超过a的最大流·要求给出算法的具体流程,并说明算法的合理性,进一步给出数值模拟的结果
急!

  • 写回答

1条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-05-19 17:58
    关注

    img


    看一下是不是你要的,不懂的可以问。

    
    #include "stdio.h"
    
    int main()
    
    {
        int a, b, i, j, k, p, n, B[10][10], C[10][10], D[10][10], P[10][10][10];
    
        printf("please input n:\n");
    
        scanf("%d", &n);
    
        printf("please input C[%d][%d],B[%d][%d]:\n", n, n, n, n);
    
        for (i = 0; i <= n; i++)
    
            for (j = 0; j <= n; j++)
    
                scanf("%7d,%7d", &C[i][j],
                      &B[i][j]); //输入各点(i,j)之间的容量C[i][j]和运费B[i][j]
    
        for (i = 0; i <= n; i++)
    
            for (j = 0; j <= n; j++)
    
            {
                D[i][j] = B[i][j];
    
                for (k = 0; k <= n; k++)
    
                    P[i][j][k] = 0;
    
                if (D[i][j] < 100) //注:100表示ViVj之间无可行路
    
                {
                    P[i][j][i] = 1;
                    P[i][j][j] = 1;
                }
            }
    
        for (k = 0; k <= n; k++)
    
            for (i = 0; i <= n; i++)
    
                for (j = 0; j <= n; j++)
    
                    if (D[i][k] + D[k][j])
    
                    {
                        D[i][j] = D[i][k] + D[k][j];
    
                        for (p = 0; p <= n; p++)
    
                            P[i][j][p] = P[i][k][p] || P[k][j][p];
    
                    } //调用FLOYD算法
    
        printf("D[%d][%d]:\n", n, n);
    
        for (i = 0; i <= n; i++)
    
        {
            for (j = 0; j <= n; j++)
    
                printf("%7d", D[i][j]);
    
            printf("\n");
    
        } //由表D中的数值确定V0V5的最短路
    
        a = C[1][3];
        b = B[1][3] * D[0][5];
    
        printf("a=%d,b=%d\n", a, b);
    
        B[1][3] = 100; //将容量已满的路改为不可行路
    
        for (i = 0; i <= n; i++)
    
            for (j = 0; j <= n; j++)
    
            {
                D[i][j] = B[i][j];
    
                for (k = 0; k <= n; k++)
    
                    P[i][j][k] = 0;
    
                if (D[i][j] < 100)
    
                {
                    P[i][j][i] = 1;
                    P[i][j][j] = 1;
                }
            }
    
        for (k = 0; k <= n; k++)
    
            for (i = 0; i <= n; i++)
    
                for (j = 0; j <= n; j++)
    
    if(D[i][k]+D[k][j])
    
    {
                        D[i][j] = D[i][k] + D[k][j];
    
                        for (p = 0; p <= n; p++)
    
                            P[i][j][p] = P[i][k][p] || P[k][j][p];
    
    } //调用FLOYD算法
    
    printf("D[%d][%d]:\n",n,n);
    
    for(i=0;i<=n;i++)
    
    {
                        for (j = 0; j <= n; j++)
    
                            printf("%7d", D[i][j]);
    
                        printf("\n");
    
    } //由表D中的数值确定V0V5的新最短路
    
    a=a+C[1][2];b=b+D[0][5];
    
    printf("a=%d,b=%d\n",a,b);
    
    B[0][1]=100;B[1][2]=100;B[4][3]=100; //将容量已满的路改为不可行路
    
    for(i=0;i<=n;i++)
    
    for(j=0;j<=n;j++)
    
    {
                        D[i][j] = B[i][j];
    
                        for (k = 0; k <= n; k++)
    
                            P[i][j][k] = 0;
    
                        if (D[i][j] < 100)
    
                        {
                            P[i][j][i] = 1;
                            P[i][j][j] = 1;
                        }
    
    }
    
    for(k=0;k<=n;k++)
    
    for(i=0;i<=n;i++)
    
    for(j=0;j<=n;j++)
    
    if(D[i][k]+D[k][j])
    
    {
                        D[i][j] = D[i][k] + D[k][j];
    
                        for (p = 0; p <= n; p++)
    
                            P[i][j][p] = P[i][k][p] || P[k][j][p];
    
    } //调用FLOYD算法
    
    printf("D[%d][%d]:\n",n,n);
    
    for(i=0;i<=n;i++)
    
    {
                        for (j = 0; j <= n; j++)
    
                            printf("%7d", D[i][j]);
    
                        printf("\n");
    
    } //由表D中的数值确定V0V5的新最短路
    
    a=a+C[2][4]-C[4][3];b=b+D[0][5];
    
    printf("a=%d,b=%d\n",a,b);
    
    B[2][4]=100; //将容量已满的路改为不可行路
    
    for(i=0;i<=n;i++)
    
    for(j=0;j<=n;j++)
    
    {
                        D[i][j] = B[i][j];
    
                        for (k = 0; k <= n; k++)
    
                            P[i][j][k] = 0;
    
                        if (D[i][j] < 100)
    
                        {
                            P[i][j][i] = 1;
                            P[i][j][j] = 1;
                        }
    
    }
    
    for(k=0;k<=n;k++)
    
    for(i=0;i<=n;i++)
    
    for(j=0;j<=n;j++)
    
    if(D[i][k]+D[k][j])
    
    {
                        D[i][j] = D[i][k] + D[k][j];
    
                        for (p = 0; p <= n; p++)
    
                            P[i][j][p] = P[i][k][p] || P[k][j][p];
    
    } //调用FLOYD算法
    
    printf("D[%d][%d]:\n",n,n);
    
    for(i=0;i<=n;i++)
    
    {
                        for (j = 0; j <= n; j++)
    
                            printf("%7d", D[i][j]);
    
                        printf("\n");
    
    } //检验有无V0V5的新最短路
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月21日
  • 已采纳回答 5月19日
  • 修改了问题 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答