leetcode 207. Course Schedule
2016-03-25 20:40
381 查看
There are a total of n courses you have to take, labeled from
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair:
Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses.
There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.
For example:
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is
Another correct ordering is
图论问题,有向图判断是否有环
class Solution {
//判断有向图是否有环
bool is_cycle(vector<vector<int>>&adjlist, vector<int>&cnt)
{
vector<int>visited(adjlist.size());
for (int i = 0; i < adjlist.size(); i++)
{
if (!adjlist[i].empty() && visited[i]==0)
{
vector<vector<int>>que;
vector<int>aa; aa.push_back(i); visited[i] = 1;
que.push_back(aa);
while (!que.empty())
{
vector<vector<int>>newque;
for (int j = 0; j < que.size(); j++)
{
if (!adjlist[que[j].back()].empty())
{
for (int k = 0; k < adjlist[que[j].back()].size(); k++)
{
if (find(que[j].begin(), que[j].end(), adjlist[que[j].back()][k]) != que[j].end())
return true;
vector<int>bb = que[j];
bb.push_back(adjlist[que[j].back()][k]);
visited[adjlist[que[j].back()][k]] = 1;
newque.push_back(bb);
}
}
}
que = newque;
}
}
}
return false;
}
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
if (prerequisites.size() < 2)
return true;
vector<vector<int>>adjlist(numCourses);
vector<int>cnt(numCourses);
for (int i = 0; i < prerequisites.size(); i++)
{
adjlist[prerequisites[i].second].push_back(prerequisites[i].first);
cnt[prerequisites[i].first]++;
}
vector<int>aa;
if (find(cnt.begin(), cnt.end(), 0) == cnt.end())
return false;
return !is_cycle(adjlist,cnt);
}
};
深度优先会超时,用广度优先
accepted
0to
n - 1.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair:
[0,1]
Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses.
There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is
[0,1]
4, [[1,0],[2,0],[3,1],[3,2]]
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is
[0,1,2,3].
Another correct ordering is
[0,2,1,3].
图论问题,有向图判断是否有环
class Solution {
//判断有向图是否有环
bool is_cycle(vector<vector<int>>&adjlist, vector<int>&cnt)
{
vector<int>visited(adjlist.size());
for (int i = 0; i < adjlist.size(); i++)
{
if (!adjlist[i].empty() && visited[i]==0)
{
vector<vector<int>>que;
vector<int>aa; aa.push_back(i); visited[i] = 1;
que.push_back(aa);
while (!que.empty())
{
vector<vector<int>>newque;
for (int j = 0; j < que.size(); j++)
{
if (!adjlist[que[j].back()].empty())
{
for (int k = 0; k < adjlist[que[j].back()].size(); k++)
{
if (find(que[j].begin(), que[j].end(), adjlist[que[j].back()][k]) != que[j].end())
return true;
vector<int>bb = que[j];
bb.push_back(adjlist[que[j].back()][k]);
visited[adjlist[que[j].back()][k]] = 1;
newque.push_back(bb);
}
}
}
que = newque;
}
}
}
return false;
}
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
if (prerequisites.size() < 2)
return true;
vector<vector<int>>adjlist(numCourses);
vector<int>cnt(numCourses);
for (int i = 0; i < prerequisites.size(); i++)
{
adjlist[prerequisites[i].second].push_back(prerequisites[i].first);
cnt[prerequisites[i].first]++;
}
vector<int>aa;
if (find(cnt.begin(), cnt.end(), 0) == cnt.end())
return false;
return !is_cycle(adjlist,cnt);
}
};
深度优先会超时,用广度优先
accepted
相关文章推荐
- git commit 撤销
- 有料面试题之--Object里面的方法
- PAT1030. Travel Plan (30)
- Android课程---布局管理器
- 你真的会写单例模式吗——Java实现
- Ubuntu Linux64 安装配置Spark1.6.1
- bzoj4456 uoj184 ZJOI2016T2 旅行者 分治+最短路
- 把bitmap保存到手机相册
- Flash as3数据类型介绍
- 2012年浙大:Head of a Gang
- Android权限监控拦截动态实现
- String与StringBuffer
- 求平均数的方法以及数的移位
- PAT (Advanced Level) Practise 1095 Cars on Campus (30)
- [bzoj4025]二分图
- 1. Two Sum
- 深入浅出Mybatis-与Spring集成
- VMWaer克隆centos后网络的问题解决
- android Scroll学习
- 如何解决数组的从小到大的排序