求图中所有路径

阿里巴巴测评题:

 思路:从某一个顶点开始,对其进行深搜,找到以它开始的左右路径,注意必须从头结点开始。代码如下:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
using std::vector;
using std::map;

void findPath( multimap<int,int>& path,vector<bool>& isHead,vector<vector<int>>& res,vector<int>& tmp,int v );
int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		vector<int> time(n + 1,0);
		vector<bool> isHead(n + 1, true);
		for (int i = 1; i <= n; ++i)
		{
			int t;
			cin >> t;
			time[i] = t;
		}
		multimap<int, int> path;
		for (int j = 0; j < m; ++j)
		{
			int x, y;
			cin >> x >> y;
			path.insert(make_pair(x, y));
			isHead[y] = false;
		}
		vector<vector<int>> res;
		vector<int> tmp;
		for (int i = 1; i <= n; ++i)
		{
			if (isHead[i])
			{
				findPath(path, isHead, res, tmp, i);
			}
		}
		for (int i = 0; i < res.size(); ++i)
		{
			cout << "path:" << i + 1 << ":";
			for (int j = 0; j < res[i].size(); ++j)
			{
				cout << res[i][j] << " ";
			}
			cout << endl;
		}
	}
	return 0;
}

void findPath( multimap<int, int>& path, vector<bool>& isHead, vector<vector<int>>& res, vector<int>& tmp, int v)
{
	if (!isHead[v])
		return;
	tmp.push_back(v);
	multimap<int, int>::iterator it=path.find(v);
	if (it != path.end())
	{
		int n = path.count(v);
		for (int j = 0; j < n; ++j, ++it)
		{
			findPath(path, isHead, res, tmp, it->second);
		}
	}
	else
	{
		res.push_back(tmp);
	}
	tmp.pop_back();
}

 


版权声明:本文为pzp201833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。