HDU1285拓扑排序实例分析
来源:互联网 发布:易语言文本处理源码 编辑:程序博客网 时间:2024/05/29 19:24
本题主要运用拓扑排序来解题,将每个队伍作为一个节点,如果两个队友有比赛,胜者作为负者的入度。如果负者输于多个队伍,则进行入度加运算,如果出去的是它的入度,则进行入度减一运算,每次取入度为0,切编号小的数。即按顺序遍历所有节点,发现入读为0且未排序的节点。即中止此次遍历,对其进行出栈,处理 并将与其相邻的节点的入度-1.用if(i==n)来做防止图有回路。下面是具体代码实现:(已AC)
<span style="font-size:18px;">import java.util.Scanner;public class Main{ static int n; static int m; static int degre[];//入度数 static int sorted[];//是否排序。0未排,1已排 static int arc[][];//胜负结果数组 static Scanner sc=new Scanner(System.in); public static void main(String[] args) { while(sc.hasNext()){ n=sc.nextInt(); m=sc.nextInt(); init(); topoSort(); } } private static void topoSort() { int s=0;//已排序的节点数 while(s<n){ int i=0; //按顺序遍历所有节点,发现入读为0且未排序的节点。即中止此次遍历,对其进行出栈,处理 并将与其相邻的节点的入度-1. for(i=0;i<n;i++){ if(degre[i]==0&&sorted[i]==0){ break; } } if(i==n){ System.out.println("图有回路,无解"); return; } //对for循环中找的节点i进行处理 sorted[i]=1; s++; System.out.print(i+1); if(s<n){ System.out.print(" "); } for(int j=0;j<n;j++){ if(arc[i][j]!=0){ degre[j]--;//把以i节点 为起点 节点j的入度-1; } } } System.out.println(); } private static void init() { //数组初始化 sorted=new int[n]; degre=new int[n]; arc=new int[n][n]; for (int i = 0; i < n; i++) { sorted[i]=0; degre[i]=0; for (int j = 0; j <n; j++) { arc[i][j]=0; } } //每场比赛胜负的输入 for (int i = 0; i < m; i++) { int a=sc.nextInt()-1; int b=sc.nextInt()-1; if (arc[a][b]==0) {//防护有重复边 arc[a][b]=1;//节点a与节点b有连通 degre[b]++;//节点b的入度+1 } } }}</span>
0 0
- HDU1285拓扑排序实例分析
- hdu1285拓扑排序
- HDU1285 拓扑排序
- HDU1285-拓扑排序
- hdu1285拓扑排序
- hdu1285(拓扑排序)
- hdu1285 拓扑排序
- hdu1285(拓扑排序)
- hdu1285+hdu2467(拓扑排序)
- hdu1285拓扑排序
- hdu1285 简单拓扑排序
- hdu1285(拓扑排序)
- hdu1285 & hdu4857 --拓扑排序
- hdu1285拓扑排序
- hdu1285(拓扑排序)
- hdu1285-拓扑排序
- hdu1285(拓扑排序)
- hdu1285及拓扑排序模板
- XML概述
- 如何在终端输出带颜色的字体?PHP CLI输出颜色
- activity的启动模式
- Linux开启mysql远程连接的设置步骤
- Android消息推送1----原始的socket长链接
- HDU1285拓扑排序实例分析
- IOS学习 UIDatePicker 包含时间格式转换
- strlen()与sizeof
- linux 进程的虚拟地址和内核中的虚拟地址有什么关系
- class.getResource()用法
- FTP 服务器搭建
- Hadoop数据压缩
- 最简真分数
- 一个不安分的肥猫程序猿