RMB求2个算法

inori0821 2010-05-14 11:02:54
自动打开一个文本文件,读取文本文件中的表格(N列*N行),格式自定
有N个机器及N个任务,大概如下
JOB Job 1 Job 2 Job 3 Job 4
Machine 1 14 5 8 7
Machine 2 2 12 6 5
Machine 3 7 8 3 9
Machine 4 2 4 6 10
每个机器完成不同的任务所需的时间是不同的,且机器只能被分配一个任务,不需要考虑重新利用问题,求最短的分配方案



自动打开一个文本文件,读取文本文件中的表格(N列*N行),格式自定
里面的表格代表的是有 N个村庄,表格列出了每个村庄到其他村庄的距离
From Village 1 Village 2 Village 3 Village 4 Village 5 Village 6
Village 1 0 10 20 30 30 20
Village 2 10 0 25 35 20 10
Village 3 20 25 0 15 30 20
Village 4 30 35 15 0 15 25
Village 5 30 20 30 15 0 14
Village 6 20 10 20 25 14 0
现在想造消防站,求最少需要造几个消防站,这样可以让任意村庄都至少有一个消防站可以在15分钟内到达

求以上2个算法的实现,C++,C,伪代码均可
600RMB酬谢
请愿意接的留个联系方式,如果对酬劳不满意,可再详谈,时间只有2天哦。
...全文
274 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
inori0821 2010-05-19
  • 打赏
  • 举报
回复
Thanks for the all people help^ ^
Excellent point
luwei6_6 2010-05-18
  • 打赏
  • 举报
回复
不好意思,脑袋确实秀逗了,第二题还是最小顶点覆盖问题,NP完全的
heilaohu7467 2010-05-17
  • 打赏
  • 举报
回复
工商卡号:622202 1106004593483王虎
建设银行:6227 0012 5355 0039 819王虎
农业银行:622848 0452924401717王虎 QQ244479979 以后有帮助在联系 说话算话啊
绿色夹克衫 2010-05-16
  • 打赏
  • 举报
回复
不好意思,脑袋秀逗了,希望没有误导大家,第二个问题是最小路径覆盖问题,解法同样是二分图匹配。
绿色夹克衫 2010-05-16
  • 打赏
  • 举报
回复
第一题:匈牙利算法或二分图的K匹配(前两天仔细查了一下二分图解法的具体名字)
第二题:看起来像最小顶点覆盖

LZ为什么要用真钱解这种问题?是不是竞赛题?
绿色夹克衫 2010-05-16
  • 打赏
  • 举报
回复
不好意思,脑袋确实秀逗了,第二题还是最小顶点覆盖问题,NP完全的。
yyfhz 2010-05-16
  • 打赏
  • 举报
回复
第2题若是不考虑连通条件,是否可以用K-means算法求解?
超级大笨狼 2010-05-16
  • 打赏
  • 举报
回复
参考这个问题。生成排列组合,利用了一些二进制的技巧,记录不重复小整数,产生排列或组合
代码短小
http://topic.csdn.net/u/20100508/22/7bc92b38-770e-462d-8662-d9ef8ed3afb4.html

可以用在回朔类问题上,你这两个题目都是可以递归搜索回朔求解的,
复杂度都是NP的,就是阶乘的,累电脑。

当然有更快的解法,就需要运筹学/线型规划的知识,累人。
先手工按照运筹学的理论算出来,观察规律,再确定排除方案,递归剪枝或证明通式。
problc 2010-05-15
  • 打赏
  • 举报
回复
假设消防站建在村里,第二个算法实现

/*里面的表格代表的是有 N个村庄,表格列出了每个村庄到其他村庄的距离
From Village 1 Village 2 Village 3 Village 4 Village 5 Village 6
Village 1 0 10 20 30 30 20
Village 2 10 0 25 35 20 10
Village 3 20 25 0 15 30 20
Village 4 30 35 15 0 15 25
Village 5 30 20 30 15 0 14
Village 6 20 10 20 25 14 0
现在想造消防站,求最少需要造几个消防站,这样可以让任意村庄都至少有一个消防站可以在15分钟内到达*/

#include <iostream>
#include <vector>
using namespace std;
#define M 6 //N个村庄
int threshold = 15;//15分钟内到达

int a[M][M] = { 0,10,20,30,30,20,\
10,0 ,25,35,20,10,\
20,25,0 ,15,30,20,\
30,35,15,0 ,15,25,\
30,20,30,15,0 ,14,\
20,10,20,25,14,0};

struct TValid //第num个村庄有消防站,则15分钟内可以到达validVect内的村庄
{
int num;
vector<int> validVect;
};

TValid valid[M];
int checked[M] = {0};//第i个消防站放在checked[i]村庄中
int result[M] = {0};//最终结果

int minCount = M;//保存最少需要造几个消防站

int countExist(int n)
{
int bitChecked[M] = {0};
int res = 0;
for (int i = 0; i < n; i++)
{
if (bitChecked[checked[i]] == 0)
{
res += 1;
bitChecked[checked[i]] = 1;
}
}
return res;
}

void check(int n)
{
if (n > M-1)
{
int curCount = countExist(M);
if (curCount < minCount)
{
minCount = curCount;
for (int i = 0; i < M; i++)
{
result[i] = checked[i];
}
}
return;
}
TValid curValid = valid[n];
vector<int>::iterator it;
for (it = curValid.validVect.begin(); it != curValid.validVect.end();++it)
{
checked[n] = *it;
if (countExist(n) >= minCount)
continue;
check(n+1);
}
}

void printResult()//打印结果
{
cout<<"最少需要造 "<<minCount<<" 个消防站"<<endl;
int bitChecked[M] = {0};
cout<<"分别在:";
for (int i = 0; i < M; i++)
{
if (bitChecked[result[i]] == 0)
{
bitChecked[result[i]] = 1;
cout<<"Village "<<result[i]+1<<" ";
}
}
cout<<endl;
}

int main()
{
for (int i = 0; i < M; i++)
{
valid[i].num = i;
for (int j = 0; j < M; j++)
{
if(a[i][j] <= threshold)
{
valid[i].validVect.push_back (j);
}
}
}
check(0);
printResult();
return 0;
}


michael122 2010-05-14
  • 打赏
  • 举报
回复
消防站应该可以不建在村里吧
感觉这题你要先把所有村庄的平面坐标给算出来,然后才好求解
XLL19880206 2010-05-14
  • 打赏
  • 举报
回复
学习一下。。。
cftzh 2010-05-14
  • 打赏
  • 举报
回复
这个第一个还可以,第二题相当BT了,我可以说说个人想法,看样子消防站只能建在村内了,
N个村庄最多需要N个消防站,
然后每个村庄查找距此村庄15KM以内的村庄个数,
如果小于1,那么就必须保留这个村庄的消防站
如果等于1,那么查询符合这个1的村庄个数,如果还等于1,那么可以删除一个了
如果大于1,那么可以删除原村庄的
如果大于1,那么就要查找连接这个村庄的15KM以内的村庄(看看这些村庄各自都有几个可利用的消防站),
如果等于1,删除本村的


这个是我的基本思路,但还没完,还有多对多没有考虑进去,所以觉得确实很BT
problc 2010-05-14
  • 打赏
  • 举报
回复
第一个算法实现,从文件读到数组就先不写了.

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define M 4
int a[M][M] = {14,5,8,7,\
2,12,6,5,\
7,8,3,9,\
2,4,6,10};
int b[M];
int compare(int i,int j)
{
if (a[i][i] + a[j][j] < a[i][j] + a[j][i])
return 0;
else
return 1;
}

void exchange(int m,int n)
{
int temp[M];
for (int i = 0; i < M; i++)
{
temp[i] = a[m][i];
}
for (int i = 0; i < M; i++)
{
a[m][i] = a[n][i];
}
for (int i = 0; i < M; i++)
{
a[n][i] = temp[i];
}
int t = b[m];
b[m] = b[n];
b[n] = t;
}
int main () {
for (int i = 0; i < M; i++)
{
b[i] = i;
}
for (int i = 0; i < M; i++)
{
for (int j = i+1; j < M; j++)
{
if (compare(i,j) > 0)
{
exchange(i,j);
}
}
}
for (int i = 0; i < M; i++)
{
cout<<"Machine "<<b[i]+1<<" execute JOB "<<i+1;
cout<<endl;
}
int total = 0;
cout<<"Total: ";
for (int i = 0; i < M; i++)
{
total += a[i][i];
cout<<a[i][i]<<" ";
}
cout<<"="<<total;
return 0;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧