
//规定的总时间
int totalTime = 10;
//此二维数组map[i][j]代表了(i,j)所需要的的时间
int[][] map;
int row, col;
int maxTime;
public void func() {
map = new int[2][2];
row = map.length;
col = map[0].length;
dfs(map, 0, 0, 0);
System.out.println(maxTime);
}
public void dfs(int[][] map, int x, int y, int time) {
//剪枝
if (time > totalTime)
return;
if (x == row - 1 && y == col - 1) {
maxTime = Math.max(maxTime, time);
}
if (x + 1 < row)
dfs(map, x + 1, y, time + map[x + 1][y]);
if (y + 1 < col)
dfs(map, x, y + 1, time + map[x][y + 1]);
}

import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
//建立入度表
int[] inDegree=new int[n+1];
PriorityQueue<Integer> queue=new PriorityQueue<>();
//建立邻接表
List<List<Integer>> list=new ArrayList<>();
for(int i=0;i<n+1;i++){
list.add(new ArrayList<>());
}
int a,b;
for(int i=0;i<m;i++){
//b依赖于a,a完成才能进行b
a=sc.nextInt();
b=sc.nextInt();
//分别往邻接表和入度表中填入数据
list.get(a).add(b);
inDegree[b]++;
}
for(int i=1;i<n+1;i++){
//如果入度为0,则可进入队列
if(inDegree[i]==0)
queue.offer(i);
}
StringBuilder sb=new StringBuilder();
int index=0;
while(!queue.isEmpty()){
int head=queue.poll();
index++;
sb.append(head+" ");
List<Integer> tmp=list.get(head);
for(Integer num: tmp){
inDegree[num]--;
if(inDegree[num]==0){
queue.offer(num);
}
}
}
if(index==n)
System.out.println(sb.toString());
else
System.out.println("-1");
}
}

并查集
import java.util.*;
public class Main{
static int n=100010;
//p[i]表示 i的父节点之一为p[i]
private static int[] p=new int[n];
//找到祖宗节点
//只有祖宗节点才有p[i]=i;
public static int find(int x){
while(pre[x] != x){ //如果x的上级不是自己(则说明找到的人不是教主)
x = pre[x]; //x继续找他的上级,直到找到教主为止
}
return x;
}
//dind函数优化路径的写法,每个节点直指祖宗节点
int find(int x) //查找结点 x的根结点
{
if(pre[x] == x) return x; //递归出口:x的上级为 x本身,即 x为根结点
return pre[x] = find(pre[x]); //此代码相当于先找到根结点 rootx,然后pre[x]=rootx
}
//合并两个节点
public static void join(){
int fx=find(x), fy=find(y); //找到祖宗节点
if(fx != fy)
p[fx]=fy; //合并
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
//p[i]初始化,所有的p[i]=i,即初始所有节点的祖宗都是自己
for(int i=0;i<n;i++){
p[i]=i;
}
String opt;
int a,b;
for(int i=0;i<m;i++){
opt=sc.next();
a=sc.nextInt();
b=sc.nextInt();
if(opt.equals("M")){
p[find(a)]=find(b);
}else{
if(find(a)==find(b))
System.out.println("Yes");
else
System.out.println("No");
}
}
}
}
1万+

被折叠的 条评论
为什么被折叠?



