请教一个图论算法

haian2442 2007-01-05 11:35:18
在一个无向图中,给出两个点u和v,并且u和v间没有边,求出这两个点间最多的不相交的简单路径数目?
...全文
554 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_programmer 2007-02-28
  • 打赏
  • 举报
回复
一个相似的问题:
给出一组顶点对(ui,vi),如何尽量的把它们连接起来(ui连接vi),并且通路不相交

更实际的问题:
ui,vi是平面上的点,如何用直线段把它们在这个平面上连接起来,通路不相交,并且线段具有宽度
haian2442 2007-02-28
  • 打赏
  • 举报
回复
这个可以用网络流的方法来做。

将这个图中除uv外的节点都分解T成两个节点T1和T2,而T1只继承那些终点为T的边,T2只继承起点为T的边,并且T1和T2间有一条边。这样就会产生一个新的图,并设置每条边的容量为1,这样就可以求出来了
zzwu 2007-01-22
  • 打赏
  • 举报
回复
分2步来求出两点间最多的不相交的简单路径数目:
1.求出两点间所有(不考虑相交不相交)的简单路径;
2.从所有简单路径中,再寻找最大不相交路径子集.


wurenxiao 2007-01-20
  • 打赏
  • 举报
回复
如图:
4----------5
/| /|
/ | / |
0--|-------1 |
| | | |
| 6-------|--7
| / | /
|/ |/
2----------3

求:0 到 1 的路径

#include <iostream.h>

const int MAX = 8;

//建立与图对应的距阵
int num[MAX][MAX]={{1,1,1,0,1,0,0,0}, {1,1,0,1,0,1,0,0},{1,0,1,1,0,0,1,0},
{0,1,1,1,0,0,0,1},{1,0,0,0,1,1,1,0},{0,1,0,0,1,1,0,1},{0,0,1,0,1,0,1,1},
{0,0,0,1,0,1,1,1}};

/**
检测重复循环的可能
*/
bool test(int s[], int length, int key)
{
for(int i=0; i<length; i++)
{
if(s[i] == key)
return false;
}
return true;
}

/**
start:起始点
end:终点
*/
void Search(int start, int end)
{
int top = 0;
int d[MAX]={0};
int s[MAX] = {0};
bool is = true;
d[top] = start;

while(top > -1)
{
is = true;
while(s[d[top]]++ < MAX)
{
if(d[top] != s[d[top]]-1 && num[d[top]][s[d[top]]-1] == 1)
{
if(s[d[top]]-1 == end) //找到输出路径
{
for(int i=0; i<=top; i++)
{
cout<<d[i]<<' ';
}
cout<<end<<endl;
}
else
{
if(test(d, top, s[d[top]]-1))
{
top++;
d[top] = s[d[top-1]]-1;
s[d[top]] = 0;
is = false;
break;
}
}
}
}
if(is == true)
{
top--; //回朔
}
}
}

void main()
{
Search(0,1); //求 0 到 1 的路径
}

输出结果:
0 1
0 2 3 1
0 2 3 7 5 1
0 2 3 7 6 4 5 1
0 2 6 4 5 1
0 2 6 4 5 7 3 1
0 2 6 7 3 1
0 2 6 7 5 1
0 4 5 1
0 4 5 7 3 1
0 4 5 7 6 2 3 1
0 4 6 2 3 1
0 4 6 2 3 7 5 1
0 4 6 7 3 1
0 4 6 7 5 1
Press any key to continue
haian2442 2007-01-20
  • 打赏
  • 举报
回复
bigc:求1-4间长为22时路径
haian2442 2007-01-20
  • 打赏
  • 举报
回复
bigc: 对Google那题我没意识到K可能取很大的情况。但是你的算法在下面的图中可能有问题:

1----2----3----4
/ \ |\
5---6 7--

37为一个长为2的回路,256为一个长为3的回路,那么取k=22时的求解
haian2442 2007-01-20
  • 打赏
  • 举报
回复
zzwu: 3-6间是两条路径
zzwu 2007-01-19
  • 打赏
  • 举报
回复
如果是

5----6
  /    /|
 /    / |
1----2  |
|    |  8
|    | /
|    |/
3----4 

在3-6之间有几个不相交的简单路径数?

bigc2000 2007-01-19
  • 打赏
  • 举报
回复
这个题个人觉得值得关注,希望贴子别掉下去了。
bigc2000 2007-01-19
  • 打赏
  • 举报
回复
To haian2442() ( ) :
当K变得很大时,不现实,最好的探测方式应该是求简单路径数,只要有一条恰好=K-2*n(n〉=0)
haian2442 2007-01-19
  • 打赏
  • 举报
回复
我刚看了些网络流方面的问题,主要针对的是边上的容量,而这个问题可以看成节点的容量。

或者网络流中的还有什么方法来解决这个问题?请赐教
haian2442 2007-01-19
  • 打赏
  • 举报
回复
bigc: u,v之间是否存在一条经过K-1个节点的路径: google的题可以用矩阵运算来求,用求传递闭包的方法来求
bigc2000 2007-01-17
  • 打赏
  • 举报
回复
认为用网络流的朋友们,说说,你们怎么想的?
bigc2000 2007-01-17
  • 打赏
  • 举报
回复
如果这个题很好的解决了,那么
今年google最后一道题目就简单了

请问 u,v之间是否存在一条经过K-1个节点的路径(可以重复)。
ruanzheng13 2007-01-15
  • 打赏
  • 举报
回复
最大流
cjq87 2007-01-05
  • 打赏
  • 举报
回复
每遍历一个元素就打上标记,标记清除之前不再被访问,可以避免“相交”
你说的最优化指什么啊?
haian2442 2007-01-05
  • 打赏
  • 举报
回复
cjq87 : 我也考虑过广度搜索,但是没有一个比较好的方式来解决“不相交”以及最优化这两个限制?你能够说的具体点吗?
cjq87 2007-01-05
  • 打赏
  • 举报
回复
我觉得用广度搜索是很容易实现的
galois_godel 2007-01-05
  • 打赏
  • 举报
回复
网络流吧

haian2442 2007-01-05
  • 打赏
  • 举报
回复
最优化指:最后的不相交路径的数目最多。

如果按照你的方法,那算法的复杂度很高

33,008

社区成员

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

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