1007. 小黄车



Time Limit: 1sec    Memory Limit:256MB
Description
随着共享经济的兴起,大学城如今到处可见ofo小黄车. 小左现在打算每天都骑小黄车从宿舍去实验室. 假设大学城的地图可以简化为一个有向图,图中有N个地点(节点),用0到N-1进行编号,有些地点之间存在有向的道路(有向边). 小左的宿舍所在地点编号为0,实验室所在地点编号为N-1. 小左希望为连续的M天规划线路,使得每天从宿舍到实验室,都至少会经过一条之前没有走过的道路(有向边). 小左想知道M的最大值,你能帮助他么?
 
请实现下面Solution类中的countPath函数,完成上述功能.
参数G: N*N(2 <= N <= 50)邻接矩阵,如果地点i到地点j之间有道路,则G[i][j] = 1;否则G[i][j] = 0. G[i][i]的值总是为0.
返回值:M的最大值. 如果不存在满足要求的路径则返回0.
 
class Solution {
public:
       int countPaths(vector<vector<int>> G) {
             
};
 
例1:
G = {{0, 1}, {1, 0}},返回值为2,因为第1天:0 --> 1,第2天 0 --> 1 --> 0 --> 1. 虽然小左第2天兜了一下圈,但他确实走了一条第1天没有走过的边1 --> 0.
 
例2:
G = {{0, 1, 1}, {1, 0, 1}, {1, 0, 0}},返回值为4.
第1天:0 --> 2
第2天:0 --> 2 --> 0 --> 2
第3天:0 --> 1 --> 2
第4天:0 --> 1 --> 0 --> 1 --> 2
 
例3:
G = {{0, 1, 0}, {1, 0, 0}, {0, 0, 0}},返回值为0.

class Solution {
private:
	vector<bool> vis, rvis;
	vector<int> Q;
public:
	int countPaths(vector<vector<int>> G) {
		int res, n, p, q, u, v, i, j;
		n = G.size();
		vis.resize(n);
		rvis.resize(n);
		Q.resize(n);
		for (i=0; i<n; i++) vis[i] = false;
		Q[0] = 0;
		vis[0] = true;
		p = 0;
		q = 1;
		while (p < q)
		{
			u = Q[p];
			for (i=0; i<n; i++)
				if (G[u][i] && !vis[i])
				{
					Q[q++] = i;
					vis[i] = true;
				}
			p ++;	
		}
		if (!vis[n-1]) return 0;
		for (i=0; i<n; i++) rvis[i] = false;
		Q[0] = n - 1;
		rvis[n-1] = true;
		p = 0;
		q = 1;
		while (p < q)
		{
			u = Q[p];
			for (i=0; i<n; i++)
				if (G[i][u] && !rvis[i])
				{
					Q[q++] = i;
					rvis[i] = true;
				}
			p ++;	
		}
		res = 0;
		for (i=0; i<n; i++) for (j=0; j<n; j++) if (G[i][j] && vis[i] && rvis[i] && vis[j] && rvis[j]) res ++;
		for (i=0; i<n; i++) if (vis[i] && rvis[i]) res --;
		return res + 2;
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值