首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

上面这个有关问题用非回溯法可行吗

2012-08-14 
下面这个问题用非回溯法可行吗?//假设需要N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费

下面这个问题用非回溯法可行吗?
//假设需要N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不同。下面计算总费用最小的一种工作分配方案。在该方案中,为每个人分配1个不同的任务。
//我想用非回溯法,下面是我的程序。

C/C++ code
#include <iostream>using namespace std;const int Max=100000;//设置任务工资上限int Min(int *a[],int n,int i){    int t=Max,b,c;        for (int j=0;j<n;j++)        {            if (t>a[i][j])            {                t=a[i][j];                b=i;                c=j;            }        }    int k=t;    for ( j=0;j<n;j++)    {        a[b][j]=Max;    }    for (i=0;i<n;i++)    {        a[i][c]=Max;    }    return k;}void main(){    const int n=3;//可以扩大n来说明不是最省情况    int *a[n];     for(int i = 0; i <n; i++)    {        a[i]=new int[n] ;     }    for ( i=0;i<n;i++)    {        for (int j=0;j<n;j++)        {            cin>>a[i][j];        }    }    int sum=0;    for ( i=0;i<n;i++)    {        sum+=Min(a,n,i);    }    cout<<sum<<endl;}

//如果不行,那么请举出实例,说明回溯法比我这个方法更省钱。(我感觉有的情况可能不是最省,不过个人感觉大多数情况下本程序都是最省的。)
//跪求本程序不是最省的情况。如果确实存在,那么我不得不再看看回溯法怎么运行的。

[解决办法]
建图做最小费用最大流就可以,每个人有1条入边,每个人和每个任务有一条边,每个任务有一条出边。
[解决办法]
典型的“指派问题”,百度“匈牙利法”,即可解决。

热点排行