图求最短路径

class DeepTrace
{
public:
    void InitMap(const vector<vector<int> > vMap, const int &portNum)
    {
        m_map = vMap;
        m_portNum = portNum;
        m_traceTree.clear();
    }

    bool GetRule(const int &beginPos, const int &endPos, list<int> &rules)
    {
        if(beginPos <0 || beginPos >= m_portNum)
            return false;
        if(endPos <0 || endPos >= m_portNum)
            return false;

        m_traceTree.clear();
        vector<bool> hasWalk(m_portNum, false);
        queue<int> q; q.push(beginPos);
        m_traceTree.push_back(make_pair(beginPos, -1));
        int nPos = 0;
        while(!q.empty())
        {
            int nowPos = q.front(); q.pop();
            hasWalk[nowPos] = true;
            if(nowPos == endPos)
            {
                print_rule(nPos, rules);
                return true;
            }
            vector<int> tmp = m_map[nowPos];
            vector<int> :: const_iterator pos = tmp.begin();
            const int parent = nPos;//m_traceTree.size() - 1;
            for(;pos != tmp.end(); ++pos)
            {
                if(false == hasWalk[*pos])
                {
                    q.push(*pos);
                    m_traceTree.push_back(make_pair(*pos,parent));
                }
            }
            ++nPos;
        }
        return false;
    }
private://nPos是树的位置, 从树的某个节点开始,回溯到开始节点
    void print_rule(int nPos, list<int> &rules)
    {
        if(nPos < 0 || nPos >= m_traceTree.size())
            return;

        int index = 0;
        do
        {
            rules.push_front(m_traceTree[nPos].first);
            ++index;
            nPos = m_traceTree[nPos].second;
            //for(int i= 0; i < 11; i++)
                //cout<< m_traceTree[i].first << m_traceTree[i].second <<endl;
            //cout<< "npos " << nPos <<endl;;
        }while(index <= m_traceTree.size() && m_traceTree[nPos].second != -1);
        return;
    }
    vector<vector<int> > m_map;
    int m_portNum;
    vector<pair<int, int> > m_traceTree; //valie ,parentindex
};

int main()
{
    vector<int> tmp;
    vector<vector<int > > vMap;
    //0
    tmp.push_back(1);
    tmp.push_back(2);
    vMap.push_back(tmp);

    //1
    tmp.clear();
    tmp.push_back(3);
    tmp.push_back(5);
    vMap.push_back(tmp);


    //2
    tmp.clear();
    tmp.push_back(0);
    tmp.push_back(3);
    vMap.push_back(tmp);


    //3
    tmp.clear();
    tmp.push_back(1);
    tmp.push_back(2);
    tmp.push_back(4);
    tmp.push_back(6);
    vMap.push_back(tmp);


    //4
    tmp.clear();
    tmp.push_back(3);
    tmp.push_back(7);
    vMap.push_back(tmp);


    //5
    tmp.clear();
    tmp.push_back(1);
    tmp.push_back(6);
    vMap.push_back(tmp);


    //6
    tmp.clear();
    tmp.push_back(3);
    tmp.push_back(5);
    tmp.push_back(7);
    vMap.push_back(tmp);


    //7
    tmp.clear();
    tmp.push_back(4);
    tmp.push_back(6);
    vMap.push_back(tmp);

    DeepTrace obj;
    obj.InitMap(vMap, 8);

    list<int> listRules;
    bool findit = obj.GetRule(0, 7, listRules);
    list<int> ::const_iterator pos = listRules.begin();
    cout<< "----------" <<endl;
    for(; pos != listRules.end(); ++pos)
    {
        cout<< *pos << " " <<endl;
    }

图的数据结构组织形式:
vector < vector< int > >
0-》1,2
1-》3,5
2-》0,3
3-》1,2,4,6
4-》3,7
5-》1,6
6-》3,5,7
7-》4,6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值