207. Course Schedule -- 判断图是否有环

本文深入探讨了课程安排问题的算法解决方案,通过图论中的有向图表示课程之间的先修关系,利用拓扑排序判断是否存在有效的课程完成顺序。文章详细解释了如何通过记录每个节点的入度和遍历过程来检测环的存在,从而确定所有课程是否可以顺利完成。

207. Course Schedule

Medium

186890FavoriteShare

There are a total of n courses you have to take, labeled from 0 to 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, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]] 
Output: true
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0, and to take course 0 you should
             also have finished course 1. So it is impossible.

Note:

  1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  2. You may assume that there are no duplicate edges in the input prerequisites.

class Solution {
public:
	bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
		int x, y;
		vector<int> cur;
		vector<bool>visited(numCourses, false);
		vector<vector<int> > v(numCourses, cur);
		vector<int> In_degree(numCourses, 0);
		for (int i = 0; i < prerequisites.size(); i++)
		{
			v[prerequisites[i][1]].push_back(prerequisites[i][0]);
			In_degree[prerequisites[i][0]]++;
		}
		int cnt = 0;
		//找入度 = 0 的节点
		bool has_0 = false;
		while (true) {
			has_0 = false;
			for (int i = 0; i < numCourses; i++)
			{
				if (!visited[i] && In_degree[i] == 0) {
					has_0 = true;
					visited[i] = true;
					cnt++;
					for (int j = 0; j < v[i].size(); j++)
					{
						In_degree[v[i][j]]--;
					}

				}
			}
			if (!has_0&&cnt<numCourses) {
				return false;
			}
			if (has_0&&cnt == numCourses)
				break;
		}

		return true;
	}
};

 

<think>根据给定的用户问题,用户想要理解并解决在运行Java程序时遇到的命令行配置问题。具体给出的命令行是: --enable-native-access=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED -javaagent:D:\intellij idea\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=56896:D:\intellij idea\IntelliJ IDEA 2021.1.1\bin -Dfile.encoding=UTF-8 -classpath D:\java\out\production\java CourseSchedule 用户之前提供的引用内容涉及到Tomcat启动时因Java版本不匹配导致的类似错误(Unrecognized option: --add-opens),但这里用户是直接运行Java程序,且错误信息没有明确给出,因此需要分析这些选项的作用和可能的问题。 首先,我们需要解析这些选项: 1. `--enable-native-access=ALL-UNNAMED`: 这是Java 16引入的一个选项,用于允许未经检查的本地访问。它属于JEP 389(外来链接器API)的一部分。 2. `--add-opens java.base/java.lang=ALL-UNNAMED`: 这个选项用于在运行时打开模块的包,以便其他模块可以反射访问。这里打开`java.base`模块的`java.lang`包。 3. `-javaagent:D:\intellij idea\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=56896:D:\intellij idea\IntelliJ IDEA 2021.1.1\bin`: 这是IntelliJ IDEA的代理,用于调试支持。 4. `-Dfile.encoding=UTF-8`: 设置系统属性`file.encoding`为UTF-8。 5. `-classpath D:\java\out\production\java`: 设置类路径。 6. 最后是要运行的类名`CourseSchedule`。 用户可能遇到的问题: - 如果使用的是低于Java 16的版本,那么`--enable-native-access`选项将不被识别(类似于引用中出现的错误)。因为该选项在Java 16引入,所以如果运行境是Java 8或11,则会报错。 - `--add-opens`选项在Java 9及以上版本引入,如果使用Java 8,也会报错。 根据用户之前的引用,他们曾经在Tomcat启动时因为Java版本问题(使用Java 8而Tomcat版本过高)报错,通过切换到Java 11解决。因此,这里同样可能是Java版本不匹配。 解决方案: 1. 确认当前运行的Java版本是否支持这些选项。特别是检查`--enable-native-access`选项需要Java 16+。 2. 如果用户使用的是较低版本的Java(如8或11),则需要升级Java版本到至少16,或者移除这个选项(如果程序不需要本地访问)。 3. 如果程序确实需要这些选项,那么必须使用兼容的Java版本。 另外,关于`--add-opens`选项,在Java 9及以上版本中,它是用来解决反射访问模块系统限制的。如果用户使用Java 9+,这个选项应该没有问题。 用户给出的命令行中,选项`--add-opens`的写法有空格(`--add - opens`),这可能是复制粘贴的问题,正确写法应该是连续的:`--add-opens`。同样的,`--enable-native-access`的写法也有空格(`--enable-native-access=ALL - UNNAMED`),正确应该是`--enable-native-access=ALL-UNNAMED`(无空格)。因此,命令行中的空格可能是导致问题的原因。 所以,可能的错误原因: 1. Java版本过低,不支持这些选项。 2. 选项书写有误(存在不必要的空格)。 步骤建议: 1. 检查并修正命令行中的选项,去除不必要的空格。 2. 检查Java版本:在命令行运行`java -version`确认版本。 3. 如果版本过低,升级到合适的版本(至少Java 16),或者如果不需要这些选项,可以尝试移除它们。 根据引用[4],版本不匹配会导致类似错误,所以重点检查版本。 因此,回答用户时,需要解释这些选项的作用,指出可能的错误原因(版本问题和选项书写问题),并提供解决方案。 </think>### 解析 Java 命令行启动配置 您提供的命令行配置包含高级模块系统和调试参数,这些是 Java 9 引入模块系统后新增的特性。以下是对各参数的详细解析: ```bash --enable-native-access=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED -javaagent:D:\intellij idea\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=56896:D:\intellij idea\IntelliJ IDEA 2021.1.1\bin -Dfile.encoding=UTF-8 -classpath D:\java\out\production\java CourseSchedule ``` #### 核心参数解析 1. **`--enable-native-access=ALL-UNNAMED`** - 作用:允许未命名模块访问本地方法接口(JEP 389) - 要求:需 **Java 16+**(旧版 JDK 会报 `Unrecognized option`) - 原理:启用 Panama FFI 项目功能,允许 Java 代码安全调用本地库[^1] 2. **`--add-opens java.base/java.lang=ALL-UNNAMED`** - 作用:打破模块封装,允许反射访问 `java.lang` 包 - 典型用途:解决反射操作(如 Lombok、IDE 调试)的模块访问错误 - 语法要求:参数必须连续书写(空格会导致解析失败)[^2] 3. **`-javaagent:idea_rt.jar=56896:...`** - 功能:IntelliJ 的调试器代理 - 端口 `56896` 是 IDE 调试监听端口 - 路径包含空格时必须用引号包裹(建议改为短路径或引号) 4. **`-Dfile.encoding=UTF-8`** - 设置 JVM 默认字符编码为 UTF-8 - 影响所有字符串操作和文件读写 5. **`-classpath ...`** - 指定字节码搜索路径 - 路径包含空格时需引号包裹:`-classpath "D:\java\out\production\java"` 6. **`CourseSchedule`** - 主执行类名(需包含完整的包路径如 `com.example.CourseSchedule`) #### 常见问题与解决方案 1. **版本不兼容报错** ```log Unrecognized option: --add-opens... Error: Could not create the Java Virtual Machine ``` - **原因**:使用了低于 Java 9 的 JDK(如您引用的 JDK 8 案例[^4]) - **解决**: ```bash # 检查当前 JDK 版本 java -version # 切换至 Java 16+ (推荐 LTS 版本) sudo update-alternatives --config java # Linux[^1] ``` 2. **参数格式错误** - 错误写法:`--add - opens`(含空格) - 正确写法:`--add-opens`(必须连字符)[^2] 3. **路径问题** - 包含空格的路径(如 `D:\intellij idea\...`)需引号包裹: ```bash -javaagent:"D:\intellij idea\...\idea_rt.jar"=... ``` 4. **模块冲突** - 若主类未模块化,建议添加模块化豁免: ```bash --add-exports=java.base/sun.nio.ch=ALL-UNNAMED ``` #### 修正后的命令行示例 ```bash java \ --enable-native-access=ALL-UNNAMED \ --add-opens java.base/java.lang=ALL-UNNAMED \ -javaagent:"D:\idea\lib\idea_rt.jar"=56896:"D:\idea\bin" \ -Dfile.encoding=UTF-8 \ -classpath "D:\java\out\production\java" \ com.example.CourseSchedule ``` > **关键提示**:确保境变量 `JAVA_HOME` 指向 JDK 16+ 版本,并通过 `java -version` 验证[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值