SW练习_P3916_DFS

本文针对洛谷P3916题目进行了深入解析,分享了多次提交失败后,通过调整代码结构和输出方式成功通过的经验。文章详细介绍了使用Java实现的深度优先搜索(DFS)算法,以及如何构建有向图并进行节点遍历,最终输出正确的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题目太讨厌了,提交了几次,都说超时,看了下讨论发现思路没毛病。
参照别人的代码,修改了下输出AC了


package com.company.luogu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class P3916 {
  static List<Integer>[] lists;
  static boolean[] visited;
  static int[] res;
  public static void main(String[] args) throws Exception{
      BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st=new StringTokenizer(reader.readLine());//第1 行,2 个整数N,M。 给出N个点,M条边的有向图
      int N=Integer.parseInt(st.nextToken());//N个点
      int M=Integer.parseInt(st.nextToken());//M条边
      lists=new List[N+1];
      visited=new boolean[N+1];
      res=new int[N+1];
      for (int i = 0; i <lists.length ; i++) {
          lists[i]=new ArrayList<Integer>();
          res[i]=i;
      }
      for (int i = 0; i <M ; i++) {
          st=new StringTokenizer(reader.readLine());
          int start=Integer.parseInt(st.nextToken());
          int end=Integer.parseInt(st.nextToken());
          //要反向建边
          lists[end].add(start);
      }
      for (int i = N; i >0 ; i--) {
              DFS(i,i);
      }
      PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
      for (int i = 1; i < res.length; i++) {
          out.print(res[i] + " ");
      }
      out.flush();
      /*for (int i = 1; i <res.length ; i++) {
          System.out.printf("%d ",res[i]);
      }*/
      reader.close();
  }
  public static void DFS(int start,int max){
      if(visited[start]){
         return;
      }
          visited[start]=true;
          res[start]=max;
          for (int i:lists[start]) {
                  DFS(i,max);
          }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值