c++图的深度优先遍历 没错误 就不能遍历出来 总是少一个点

//图的深度优先遍历#include<iostream>usingnamespacestd;constintmax=100;intn;voidvisite(intv){c... //图的深度优先遍历
#include<iostream>
using namespace std;
const int max=100;
int n;
void visite(int v){
cout<<v;
return;}
class graph{
public:
void creatG(){
int i,j,x;
cout<<"请输入图的顶点数"<<endl;
cin>>n;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
cout<<"请输入这两个顶点是否为邻接点,如果是,输入1,否则请输入0"<<endl;
cout<<i+1<<j+1<<endl;
cin>>x;
edge[i][j]=x;
}
}
return;
}
void DFS_travel(){
int i;
for(i=0;i<n;i++)
visited[i]=false;
for(i=1;i<=n;i++)
if(visited[i]==false)
dfs(i);
return;
}
void dfs(int v){
int w;

visited[v]=true;
w=firstadj(v);
while (w!=0){
if(visited[w]==false)
dfs(w);
w=nextadj(v,w);
visite(w);
}
return;
}

int firstadj(int v)
{
int i;
for(i=0;i<n;i++){
if(edge[v-1][i]=1){
return i+1;
}
}
return 0;
}
int nextadj(int v,int w){
int i;
for(i=w;i<n;i++){
if(edge[v-1][i]==1&&visited[i+1]==false){
return i+1;
}
}
return 0;
}
private:
int edge[max][max];
int visited[max];
};
void main()
{
graph g;
g.creatG();
g.DFS_travel();
return ;
}
展开
 我来答
ok洛阳水席
2013-05-21 · TA获得超过1839个赞
知道小有建树答主
回答量:580
采纳率:50%
帮助的人:543万
展开全部
//图的深度优先遍历
#include<iostream>
using namespace std;
const int max=100;
int n;
void visite(int v)
{
    cout<<v;
    return;
}
class graph
{
public:
    void creatG()
    {
        int i,j,x;
        cout<<"请输入图的顶点数"<<endl;
        cin>>n;
        for(i=0;i<n;i++)
        {
            edge[i][i] = 0;//自身与自身应设为0
            for(j=i+1;j<n;j++)
            {
                cout<<"请输入这两个顶点是否为邻接点,如果是,输入1,否则请输入0"<<endl;
                cout<<i+1<<j+1<<endl;
                cin>>x;
                edge[i][j]=x;
                edge[j][i]=x;//这是无权的,所以反过来也要设为x
            }
        }
        return;
    }
    void DFS_travel()
    {
        int i;
        for(i=0;i<n;i++)
            visited[i]=false;
        for(i=0;i<n;i++) //从0开始
            if(visited[i]==false)
                dfs(i);
            return;
    }
    void dfs(int v)
    {
        int w;
                                                                                                                                                                                                  
        visited[v]=true;
        visite(v);
        for(w=firstadj(v);w!=0;w=nextadj(v,w))
        {
            if(visited[w]==false)
                dfs(w);
        }
                                                                                                                                                                                                  
        return;
    }
                                                                                                                                                                                            
    int firstadj(int v)
    {
        int i;
        for(i=0;i<n;i++)
        {
            if(edge[v][i]=1)//这都是v,i不是v+1,i-1什么的!
            {
                return i;
            }
        }
        return 0;
     }
    int nextadj(int v,int w)
    {
        int i;
        for(i=w;i<n;i++)
        {
            if(edge[v][i]==1&&visited[i]==false)//这也是!
            {
                return i;
            }
        }
        return 0;
    }
private:
    int edge[max][max];
    int visited[max];
};
void main()
{
    graph g;
    g.creatG();
    g.DFS_travel();
    return ;
}

LZ对图的储存与遍历还有误区啊!

建议自行调试,观察图中储存的变量的值的变化,能够加强理解!


不懂追问!为你们解决问题也是我学习的一部分!


2013 5 21 17:57

追问
太感谢了    已经会了   
问一下 你是用的什么编程啊
看你的截图 我看我班也有和你一样的
很好奇 嘿嘿
追答
VC ++6.0……

我装了VC++6.0
又装了VS2012,还装了CFree……

平常给别人写我都是用VC++6.0,毕竟用这个的人多一些,但VC++有一些BUG……

学习愉快,晚安,少年!
dingni666
2013-05-21
知道答主
回答量:1
采纳率:0%
帮助的人:1527
展开全部
visited数组的下标 注意下~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式