Ⅰ Pascal语言在什么软件上编写我是一点都不知道,比较菜鸟。。一直有个问题想问,java和Pascal在什么上编
我是一个搞NOIP竞赛的人 也搞过一点开发,你可以听听我的意见(全手打的,很累啊)
我学的就是Pascal语言,面向过程,用的是Free Pascal
如果是面向对象,就用Delphi
至于Java的编译器,可以试试NetBeans或者sun公司的jdk
像C也有面向过程和面向对象
面向过程是GCC
面向对象就是VC之类的了
Pascal的确是一个起步很好的语言,一开始就学C或C++会很累的
语言一般分3种:机器语言 汇编语言 高级语言
机器语言:能直接被CPU执行,效率极高,但是可移植性极差(换台电脑可能就不行了),写起来也很麻烦
汇编语言:不能直接被CPU执行,加入了一些人性化的东西,如加法用ADD、减法用SUB,但还是很麻烦
高级语言:效率最低,但是很人性化,可移植性很强 像Pascal C C++ JAVA都是高级语言
高级语言不能直接被计算机执行,所以就需要编译器来帮忙,把这些语句翻译一下,让CPU能执行
高级语言执行方式分两种:解释执行和编译执行
解释执行:编译器运行一句翻译一句,调试的时候就是这样的
编译执行:编译器将源文件编译成.exe的可执行文件,然后执行
像Free Pascal、Delphi、VB、VC这种,都是IDE
不仅可以编辑源代码,编译源代码,还可以调试程序等等
要学好编程,个人觉得分三块(把我下面讲的东西全学透,要1-2年)
①语法:学好语法是基础!学好了语法,才知道语言如何使用,这个不用我说吧
②数据结构(数据结构是脱离语言的,也就是说这些数据结构每个语言都好实现):这是一个很抽象的东西,有 线性表、栈、队列、堆、数、图、串、集合 等等。
分为4种:线性结构(一对一,如 栈、队列)、树形结构(一对多,如 树)、离型结构(没有连接)、网状结构(多对多,如 图)
像栈就是一种FILO表,只运行在一头进行输入输出操作,应用在 表达式求值、撤销恢复操作上面
队列是FIFO表,允许在一头进行插入操作,另一头错删除操作
树 就复杂了 树和二叉树是两种概念,具体的自己去看书吧
二叉树有许多特殊形态,如满二叉树 完全二叉树 哈夫曼树 最优二叉树(哈夫曼树不等于最有二叉树!这点有许多人弄错。因为哈夫曼树不一定是二叉的)
二叉树的三种遍历方式一定要会:前序遍历(也称先根遍历)根左右, 中序遍历(也称中根遍历)左根右, 后序遍历(也称后根遍历)左右根
图就更复杂了,分 连通与不连通 带权与不带权 有向与无向,所以就有了 (不)连通有(无)向(不)带权图这种说法 还有什么强连通图,弱连通图的,自己看书吧!
③算法(算法是脱离语言的,也就是说这些算法每个语言都好写):
1.低级算法(立意上的,就像初等数学和高等数学):穷搜、深度优先搜索(DFS)、广度优先搜索(BFS,也称宽度优先搜索),是三种不同的遍历方式
2.高级算法:贪心,分支,动态规划(DP)。其他两个不介绍了,就介绍一下动态规划吧!
动态规划:记忆化搜索,利用以前搜索留下的数据,加快解决多阶段决策最优化问题的速度。要能动态规划,问题必须满足两个条件(我背了好长时间才背出来)
①:最优化原理(也称最优性原理):无论过去的状态或决策如何,对于当前的决策所形成的状态而言,余下的诸决策必须构成最优策略。
②:无后效性:一旦一个状态的决策确定,则此后过程的演变不再受此前各状态及决策的影响,当前状态时此前历史的完整总结,此前历史只能通过当前状态去影响过程未来的演变。
学DP一般从背包开始,背包一共有8个:01背包、完全背包、多重背包、混合三种背包、二维费用背包、分组背包、有依赖的背包、泛化物品背包。
然后再学树形动态规划
还有排序算法:冒泡排序,选择排序,插入排序,快速排序,堆排序,希尔排序,基数排序,序数排序,桶排序,鸽巢排序,二叉树排序(应用二叉排序树),鸡尾酒排序(就是双向冒泡,在一次初赛的完善程序里出现过)
还有数论算法(不展开介绍了)
图论算法:
最短路(顾名思义,就是一个点到另一个点的最短路程):迪杰斯特拉(Dijkstra)、弗洛伊德(Floyd)、SPFA(国人设计的,很不错)等等 还会要解决SPFA的负权回路问题 这几个算法都是解决单源最短路径问题的,就是一个点到所有点的最短路)
最小生成树(应用在无向连通图中,就是拿掉一些边,在保证图连通的情况下,使得剩下的边权值之和最小):普利姆(Prim)、克鲁斯卡尔(Kruskal)
关键路径(在生产生活中应用很广,注意关键路径之前一定要拓扑一次!)、拓扑排序(可用于是否有环路的检测)、网络流等等
如果以上你都会了,那么恭喜你,你已经可以算是一名初级程序员了!
可以继续学 双向深搜、双向广搜、周界搜索、迭代加深搜索、迭代加宽搜索、A*广度优先启发搜索、A*迭代加深搜索 等高级的算法。
Ⅱ 请教下计算机科学与技术本科 毕业论文题目什么相对来说简单些。 那些什么管理系统是不是简单点啊
管理系统就那么些很容易重的,只要风格不一样就OK,
我当时做的是一个网站,弄个主页再弄几个副页,主要是弄的漂亮一点,在找个懂asp的同学给弄个留言板。网站上的内容丰富点,素材漂亮点就差不多。
当时我们辅导员给我们要求的不是很高,很容易就过去了。
不知道你们的怎么样,当时我好多同学也是很多做 图书馆管理系统,学籍管理系统,餐饮管理系统 ,他们的辅导员要求他们的管理系统能做到 添加--删除--查找--提示 就差不多了。也是把布局弄的合理,漂亮(找会插图或能把界面用图片代替的朋友帮忙弄一下,请人家吃顿饭!)
祝你毕业论文顺利完成!
你们计科系网站上应该有题目找个自己拿手的做,下面是我们当时的题目:
1--住宅小区智能化物业管理系统总体设计-
2--网上测评系统的设计-
3--基于web网站的综合考评系统的设计-
4--基于web网站的考试系统设计-
5--网上教育资源库系统的设计-
6--浅谈网络协议的选用对网络性能的影响-
7--高校校园网信息管理平台研制-
8--实验室管理信息系统设计与实现-
9--基于互联网的学习课件的研制-
10--基于环联网的辅导答疑系统研制-
11--智能网络入侵检测技术初步研究-
12--电子政府信息处理总体实现架构研究-
13--企业管理信息系统设计与实现-
14--人事管理信息系统设计与实现-
15--学生信息管理系统设计与实现-
16--职工信息系统设计与实现-
17--职工工资管理系统设计与实现-
18--客房管理系统设计与实现-
19--中学考试管理信息系统设计与实现-
20--自学考试管理系统设计与实现-
21--超市管理系统设计与实现-
22--考试管理系统-
23--考务管理信息系统-
24--高校数学试题库-
25--拓扑排序算法的改进(给出AOV网的所有拓扑有序序列)-
26--哈希函数构造方法研究-
27--试卷自动生成系统设计-
28--自动检测系统设计-
29--教学中常见表现手法在AW平台上的实现-
30--教学中常见表现手法在PPT平台上的实现-
31--多媒体课件制作中的跨平台操作-
32--个人网络设计-
33--单片机时间控制器开发-
34--单片机通用数据采集和处理系统-
35--数据库系统开发-
36--网页制作-
37--网络数据库开发-
38--试题库软件设计-
39--图书馆管理系统-
40--学籍管理系统--
41--基于教学型软件的设计与实现-
42--基于练习型交互软件的设计与实现-
43--基于游戏型学习软件的设计与实
44--VC实现windows文件管理-
45--单片机与微机通信-
46--单片机与红外技术-
47--电子阅览室收费系统-
48--用户登陆与权限管理子系统-
49--网络环境中的数据共享问题的分析与对策-
50--Unix与Windows NT网络互联技术-
51--单片机控制的CO2焊机的设计(mcs-51系列)-
52--单片机控制的点焊控制器设计(mcs-51系列)-
53--利用网络实现互动功能
54--利用网络实现管理功能
56--如何防止IP地址盗用-
57--局域网主干网络的选型-
58--动态网站设计-
59--企业物流管理-
60--药品管理-
61--单片机遥控技术-
62--单片机与通讯-
63--家用电器与单片控制-
64--计算机教育教学探讨-
65--计算机硬件技术理解与应用-
66--计算机辅助教学理论与实践-
1 SMART芯片仿真器系统设计
2 程序执行结果模拟器
3 计算机硬件检测系统
4 图象处理软件
5 ITS信息平台的设计与分析
6 基于B/S的职工信息管理系统
7 iButton及其应用
8 工作备忘录的设计与实现
9 基于MATLAB数据仿真
10 基于Delphi的数据通信系统
11 **中学籍管理软件
12 动态网站制作
13 数据库信息管理系统
14 网站视频点播
15 24点游戏
16 趣味绘图
17 聊天程序
18 小学算术加减法教学软件设计
19 个人网页设计与友情连接
20 图像处理软件包
21 学生英语试题题库及判分系统软件设计
22 家庭理财管理信息系统设计
23 人事信息管理系统设计
24 计量管理信息系统
25 字符智能识别方法研究
25 基于图像分析的公路路面破损统计系统企业信息管理系统
27 VB数据采集系统设计
28 VC数据采集系统设计
29 虚拟仪器数据采集系统设计
30 光栅位移传感器原理图制作及仿真
31 网络搜索引擎性能分析系统模型及设计
32 基于短信的智能导行系统模型及设计
34 远程异步视频授课系统研究
35 规划设计中图形处理技术
36 计算机图形学在装饰设计中的应用
37 公路工程试验数据处理与分析(VB与Matlab)
38 城市信号交叉口禁左仿真
39 随机仿真模型
40 高等级公路新线中线坐标放样CAE
41 **大学上下水地下管网地理信息系统设计
42 油田测井数据绘图软件开发
42 企业管理系统
43 "**"课程的网络教学系统设计与开发
44 "**"课程试题库的设计
45 地球物理数据反演系统中的图形处理
46 电子教案中电路图的绘制方法研究
47 .NET实现Internet消息平台
48 远程打印及计费管理系统
49 机房无人值守系统
50 高速公路路网描述仿真模型构建
51 基于XML的数据交换在分布式WEB系统中的应用
52 基于关系数据库的OLAP研究
53 等值线自动生成方法及程序实现
54 基于LDAP的语音服务(IP电话)中心研究
55 人工智能多媒体教学软件
56 BUG系统的设计
57 教学管理系统
58 虚拟现实技术应用研究
60 客户管理系统
61 基于Web的教学系统设计与实现
62 信息工程学院资料室信息管理系统
63 基于网络的教材管理系统
64 石油工业仪器仪表质量监督检验中心网站设计
65 非线性流水线调度算法动态演示程序设计
66 存储体系地址映象及替换算法动态演示程序设计
67 医院药房管理系统
68 门诊划价收费系统
69 公交公司人事管理系统
70 固定资产管理系统
71 网上图书馆(在线浏览及在线查询)
72 工资计算系统
73 网上超市(电子商务网站的建设)
74 客户关系管理系统
75 旅游资源研发网的开发与设计
76 《****》试题库的设计
77 餐饮娱乐管理系统的开发与设计
78 文语转换系统
79 远程数据服务平台(网站设计,数据管理系统)
80 室外环境检测模拟平台(下分:控制台软件设计,网络传输程序,监测软件设计,硬件电路设计4个子题目)
81 图像识别技术(计算特定物体的个数,图像检索技术)
82 图像检索系统设计与开发
83 视频会议系统设计与开发
84 多媒体毕业纪念册及播放系统设计开发
85 网络媒体播放器设计与实现
86 《数据结沟》算法的动态演示
87 基于B/S结构的毕业设计题目管理系统
88 **大学计算机应用研究所网站
89 客户管理系统
90 设备管理系统
91 实验室管理系统
92 《多媒体软件设计技术》课程CAI的开发
93 新闻网页自动生成系统的开发
94 网站开发
95 电子白板的设计与实现
96 蚁群算法在动态TSP问题种的应用研究
97 基于Web的异步按需点播学习系统
98 多媒体同步实时授课系统中应用程序共享研究
99 协作编辑系统
100 基于web的远程测控制系统研究
101 基于B/S模式文献检索系统的设计与开发
102 在线课题项目选题系统的设计及实现
103 学生档案信息管理系统的开发
104 在线图书馆信息管理系统的设计及实现
105 浏览器过滤软件实现
106 基于局域网的IP数据包监控软件实现
107 WDM设备驱动程序开发-键盘过滤器
108 WDM设备驱动程序开发-鼠标过滤器
109 基于OpengGL的虚拟场景漫游软件设计
110 城市公交查询系统
111 J2EE框架的构建(Weblogic+JBuilder)
112 BrokerTool Project (C/S 结构)
113 多媒体开发与应用(Java2D,Java3D,JMF,Java图形制作与动画设计)
114 计算机辅修远程教学系统设计与实现
115 《操作系统》典型算法实现
116 "***"网站设计与实现
117 门禁管理系统实现
118 计算机系网站设计及建设
119 基于Internet的网络教学系统
120 视频点播系统
121 基于Internet的车辆管理、调度系统
122 武装工作管理系统
123 门禁式网络机房计费系统
124 成人教育学生档案及成绩管理系统
125 汽车综合性能工位测控系统设计与软件实现
126 汽车制动性能虚拟检测仪器设计与软件实现
127 基于LAN的汽车性能微机检测系统
128 汽车制动信号数字滤波及曲线拟合优化方法研究
129 动态存储器的刷新
130 电磁机构的计算机设计
131 服务器端安全监控软件的设计
132 校园网络地址管理模型的设计与实现
Ⅲ 数据结构 java开发中常用的排序算法有哪些
排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准:
(1)执行时间
(2)存储空间
(3)编程工作
对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。
主要排序法有:
一、冒泡(Bubble)排序——相邻交换
二、选择排序——每次最小/大排在相应的位置
三、插入排序——将下一个插入已排好的序列中
四、壳(Shell)排序——缩小增量
五、归并排序
六、快速排序
七、堆排序
八、拓扑排序
一、冒泡(Bubble)排序
----------------------------------Code 从小到大排序n个数------------------------------------
void BubbleSortArray()
{
for(int i=1;i<n;i++)
{
for(int j=0;i<n-i;j++)
{
if(a[j]>a[j+1])//比较交换相邻元素
{
int temp;
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
-------------------------------------------------Code------------------------------------------------
效率 O(n²),适用于排序小列表。
二、选择排序
----------------------------------Code 从小到大排序n个数--------------------------------
void SelectSortArray()
{
int min_index;
for(int i=0;i<n-1;i++)
{
min_index=i;
for(int j=i+1;j<n;j++)//每次扫描选择最小项
if(arr[j]<arr[min_index]) min_index=j;
if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
-------------------------------------------------Code-----------------------------------------
效率O(n²),适用于排序小的列表。
三、插入排序
--------------------------------------------Code 从小到大排序n个数-------------------------------------
void InsertSortArray()
{
for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
{
int temp=arr[i];//temp标记为未排序第一个元素
int j=i-1;
while (j>=0 && arr[j]>temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
------------------------------Code--------------------------------------------------------------
最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表
若列表基本有序,则插入排序比冒泡、选择更有效率。
四、壳(Shell)排序——缩小增量排序
-------------------------------------Code 从小到大排序n个数-------------------------------------
void ShellSortArray()
{
for(int incr=3;incr<0;incr--)//增量递减,以增量3,2,1为例
{
for(int L=0;L<(n-1)/incr;L++)//重复分成的每个子列表
{
for(int i=L+incr;i<n;i+=incr)//对每个子列表应用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j>=0&&arr[j]>temp)
{
arr[j+incr]=arr[j];
j-=incr;
}
arr[j+incr]=temp;
}
}
}
}
--------------------------------------Code-------------------------------------------
适用于排序小列表。
效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。
壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。
五、归并排序
----------------------------------------------Code 从小到大排序---------------------------------------
void MergeSort(int low,int high)
{
if(low>=high) return;//每个子列表中剩下一个元素时停止
else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/
MergeSort(low,mid);//子列表进一步划分
MergeSort(mid+1,high);
int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素
for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/
{
if (arr[i]<=arr[j];)
{
B[k]=arr[i];
I++;
}
else
{ B[k]=arr[j]; j++; }
}
for( ;j<=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表
B[k]=arr[j];
for( ;i<=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中
B[k]=arr[i];
for(int z=0;z<high-low+1;z++)//将排序的数组B的 所有元素复制到原始数组arr中
arr[z]=B[z];
}
-----------------------------------------------------Code---------------------------------------------------
效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。
适用于排序大列表,基于分治法。
六、快速排序
------------------------------------Code--------------------------------------------
/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low];//采用子序列的第一个元素作为枢纽元素
while (low < high)
{
//从后往前栽后半部分中寻找第一个小于枢纽元素的元素
while (low < high && arr[high] >= pivot)
{
--high;
}
//将这个比枢纽元素小的元素交换到前半部分
swap(arr[low], arr[high]);
//从前往后在前半部分中寻找第一个大于枢纽元素的元素
while (low <high &&arr [low ]<=pivot )
{
++low ;
}
swap (arr [low ],arr [high ]);//将这个枢纽元素大的元素交换到后半部分
}
return low ;//返回枢纽元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low <high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n +1,high );
}
}
----------------------------------------Code-------------------------------------
平均效率O(nlogn),适用于排序大列表。
此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n²)的最糟用例效率。若数基本有序,效率反而最差。选项中间值作为枢纽,效率是O(nlogn)。
基于分治法。
七、堆排序
最大堆:后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。
思想:
(1)令i=l,并令temp= kl ;
(2)计算i的左孩子j=2i+1;
(3)若j<=n-1,则转(4),否则转(6);
(4)比较kj和kj+1,若kj+1>kj,则令j=j+1,否则j不变;
(5)比较temp和kj,若kj>temp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)
(6)令ki等于temp,结束。
-----------------------------------------Code---------------------------
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元 int I; BuildHeap(R); //将R[1-n]建成初始堆for(i=n;i>1;i--) //对当前无序区R[1..i]进行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质 } } ---------------------------------------Code--------------------------------------
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 堆排序是就地排序,辅助空间为O(1), 它是不稳定的排序方法。
堆排序与直接插入排序的区别:
直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
堆排序可通过树形结构保存部分比较结果,可减少比较次数。
八、拓扑排序
例 :学生选修课排课先后顺序
拓扑排序:把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。
方法:
在有向图中选一个没有前驱的顶点且输出
从图中删除该顶点和所有以它为尾的弧
重复上述两步,直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止。
---------------------------------------Code--------------------------------------
void TopologicalSort()/*输出拓扑排序函数。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/
{
int indegree[M];
int i,k,j;
char n;
int count=0;
Stack thestack;
FindInDegree(G,indegree);//对各顶点求入度indegree[0....num]
InitStack(thestack);//初始化栈
for(i=0;i<G.num;i++)
Console.WriteLine("结点"+G.vertices[i].data+"的入度为"+indegree[i]);
for(i=0;i<G.num;i++)
{
if(indegree[i]==0)
Push(thestack.vertices[i]);
}
Console.Write("拓扑排序输出顺序为:");
while(thestack.Peek()!=null)
{
Pop(thestack.Peek());
j=locatevex(G,n);
if (j==-2)
{
Console.WriteLine("发生错误,程序结束。");
exit();
}
Console.Write(G.vertices[j].data);
count++;
for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)
{
k=p.adjvex;
if (!(--indegree[k]))
Push(G.vertices[k]);
}
}
if (count<G.num)
Cosole.WriteLine("该图有环,出现错误,无法排序。");
else
Console.WriteLine("排序成功。");
}
----------------------------------------Code--------------------------------------
算法的时间复杂度O(n+e)。
Ⅳ 小米面试每一轮都有算法吗
一共两轮,两个不同类型的面试官,一轮要一小时左右,两轮都要纸上写代码,给我最大的感触就是问得特别深,是越来越深,直到你答不出来。
第一轮问了我STL的一些数据结构,其内部实现。我说了map是红黑树,unordered_map是hash表,之后我不小心说到hash表最常见的实现就是一个链表数组,链表是为了处理冲突。于是又问我hash表处理冲突的方式,也难不倒我。再问让我写一个hash表存储用户的图片,大概要多少位hash值才能尽可能没冲突。我大概算了一下。下一个问题是while(1) sleep(x);这里x大概要多少秒(可小数)才能使cpu忙碌。大家估计一下我心理阴影面积。然后看我操作系统内部了解不多,又问了一堆。(这就是为什么我们应该好好读<<深入理解计算机系统>>)我答得十分糟糕。之后让我写一个链表反转,我感觉有点诧异,想不到这玩意还真这么容易考到。诧异是诧异,没花我多长时间就搞定一个O(n)时间O(1)空间的链表反转了。又让我说如果要实现一个lrucache,怎么实现?我记得教材上有说过用栈,我就直接说栈,面试官反问了我一堆问题,后来我又说用链表,不过可能空间消耗比较大,面试官问我为什么,我说有个指针域(我也是蠢哭),然后就直接打发我走了。
本来我以为我没机会了,想不到一轮面试官给面子,让我到了二轮。
一上来,看见我简历上一个项目写了tfidf,就问我其是什么,我大概说了是频率和逆向频率的综合,又要我给出精确定义。我放弃(不太确定)。虽然我不久前刚看过定义,但当时没怎么仔细思考,毕竟sklearn里都有现成实现。之后让我写一个singleton,这玩意当然难不倒我。写完后又要我写一个线程安全的版本,我用了锁,但他说开销太大。我继续放弃(我印象中确实有的,但是比较底层,我对这种底层的东西没啥兴趣,要是有兴趣,一面也不会那么惨了),并反问他怎么办,他说了一个check twice(但我之后上网没找到)。之后问我拓扑排序(当然难不倒我)和java线程模型,这里我十分可笑,竟然把可重入锁说成自旋锁(自旋锁是lock后并不会让此线程立刻放弃cpu,而是等待一会;可重入锁是同一个线程可以多次获得)。又让我写二叉树后序的迭代版本,我压根没写过,只看过一次,那次看的实现还特别复杂,最惨的是,房间里另一对面试的有些影响我,心想这下出事了。磨磨蹭蹭写出了一个版本,面试官一看就否决了,我仔细一看,确实有问题,不过加上两个标记还是成功搞定。之后问了我要是去了小米想做什么,我十分可笑,说我想做比较酷的事(正常情况我是不会这么说的,我真正想法是做有趣的事,考虑到是小米),又问我做过什么酷的事,我答不出来,随口说了个装linux系统,使用cli,顿时感觉自己low爆了,还不如说在android上装linux呢!还问我哪方面比较薄弱,我当然是说计算机图形学了。之后说了我一些缺点,比如有点油(tfidf惹的货),知识面广但都不深。数据结构是不错(可能是我简历上写了解B树和红黑树),但算法不行(笔试最后两题,都只能给出差强人意的答案,不够极致(原话))。之后就把我打发走了,事后我还觉得有些希望。但这么多天过去了,越想越觉得没戏。
感觉自己还是太弱,还得多读书,多写代码,来年春招再投。
Ⅳ ACM入门学什么
初学者建议购买,《算法竞赛入门经典》 刘汝佳作,十分好,在深入可以是他的另外一本,黑书,《算法艺术与信息学竞赛》。
计划:
ACM的算法(觉得很好,有层次感)POJ上的一些水题(可用来练手和增加自信)
(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)
初期:
一.基本算法:
(1)枚举. (poj1753,poj2965)
(2)贪心(poj1328,poj2109,poj2586)
(3)递归和分治法.
(4)递推.
(5)构造法.(poj3295)
(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.图算法:
(1)图的深度优先遍历和广度优先遍历.
(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓扑排序 (poj1094)
(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
(6)最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼树(poj3253)
(6)堆
(7)trie树(静态建树、动态建树) (poj2513)
四.简单搜索
(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
(1)背包问题. (poj1837,poj1276)
(2)型如下表的简单DP(可参考lrj的书 page149):
1.E[j]=opt{D[i]+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
(2)数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
(3)计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中级:
一.基本算法:
(1)C++的标准模版库的应用. (poj3096,poj3007)
(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
(1)差分约束系统的建立和求解. (poj1201,poj2983)
(2)最小费用最大流(poj2516,poj2516,poj2195)
(3)双连通分量(poj2942)
(4)强连通分支及其缩点.(poj2186)
(5)图的割边和割点(poj3352)
(6)最小割模型、网络流规约(poj3308, )
三.数据结构.
(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)静态二叉检索树. (poj2482,poj2352)
(3)树状树组(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)并查集的高级应用. (poj1703,2492)
(6)KMP算法. (poj1961,poj2406)
四.搜索
(1)最优化剪枝和可行性剪枝
(2)搜索的技巧和优化 (poj3411,poj1724)
(3)记忆化搜索(poj3373,poj1691)
五.动态规划
(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
(1)组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
(2)数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
(3)计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)随机化算法(poj3318,poj2454)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多边形的内核(半平面交)(poj3130,poj3335)
(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高级:
一.基本算法要求:
(1)代码快速写成,精简但不失风格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保证正确性和高效性. poj3434
二.图算法:
(1)度限制最小生成树和第K最短路. (poj1639)
(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最优比率生成树. (poj2728)
(4)最小树形图(poj3164)
(5)次小生成树.
(6)无向图、有向图的最小环
三.数据结构.
(1)trie图的建立和应用. (poj2778)
(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法
(RMQ+dfs)).(poj1330)
(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的
目的). (poj2823)
(4)左偏树(可合并堆).
(5)后缀树(非常有用的数据结构,也是赛区考题的热点).
(poj3415,poj3294)
四.搜索
(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)
五.动态规划
(1)需要用数据结构优化的动态规划.
(poj2754,poj3378,poj3017)
(2)四边形不等式理论.
(3)较难的状态DP(poj3133)
六.数学
(1)组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
(2)博奕论.
1.极大极小过程(poj3317,poj1085)
2.Nim问题.
七.计算几何学.
(1)半平面求交(poj3384,poj2540)
(2)可视图的建立(poj2966)
(3)点集最小圆覆盖.
(4)对踵点(poj2079)
八.综合题.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)gsyagsy 2007-11-29 00:22
以及补充 Dp状态设计与方程总结
1.不完全状态记录
<1>青蛙过河问题
<2>利用区间dp
2.背包类问题
<1> 0-1背包,经典问题
<2>无限背包,经典问题
<3>判定性背包问题
<4>带附属关系的背包问题
<5> + -1背包问题
<6>双背包求最优值
<7>构造三角形问题
<8>带上下界限制的背包问题(012背包)
3.线性的动态规划问题
<1>积木游戏问题
<2>决斗(判定性问题)
<3>圆的最大多边形问题
<4>统计单词个数问题
<5>棋盘分割
<6>日程安排问题
<7>最小逼近问题(求出两数之比最接近某数/两数之和等于某数等等)
<8>方块消除游戏(某区间可以连续消去求最大效益)
<9>资源分配问题
<10>数字三角形问题
<11>漂亮的打印
<12>邮局问题与构造答案
<13>最高积木问题
<14>两段连续和最大
<15>2次幂和问题
<16>N个数的最大M段子段和
<17>交叉最大数问题
4.判定性问题的dp(如判定整除、判定可达性等)
<1>模K问题的dp
<2>特殊的模K问题,求最大(最小)模K的数
<3>变换数问题
5.单调性优化的动态规划
<1>1-SUM问题
<2>2-SUM问题
<3>序列划分问题(单调队列优化)
6.剖分问题(多边形剖分/石子合并/圆的剖分/乘积最大)
<1>凸多边形的三角剖分问题
<2>乘积最大问题
<3>多边形游戏(多边形边上是操作符,顶点有权值)
<4>石子合并(N^3/N^2/NLogN各种优化)
7.贪心的动态规划
<1>最优装载问题
<2>部分背包问题
<3>乘船问题
<4>贪心策略
<5>双机调度问题Johnson算法
8.状态dp
<1>牛仔射击问题(博弈类)
<2>哈密顿路径的状态dp
<3>两支点天平平衡问题
<4>一个有向图的最接近二部图
9.树型dp
<1>完美服务器问题(每个节点有3种状态)
<2>小胖守皇宫问题
<3>网络收费问题
<4>树中漫游问题
<5>树上的博弈
<6>树的最大独立集问题
<7>树的最大平衡值问题
<8>构造树的最小环
Ⅵ 编写java程序:输入一组整数存放在数组中,比较并输出其中最大值和最小值,并将数组
public class Arr{
//数组
int[] arr = {3,1,6,4,5,10,2};
//对数组进行简单的排序
java.util.Arrays.sort(arr);
//输出最大值、最小值
System.out.println("最大值:" + arr[arr.length-1] +" 最小值:" + arr[0]);
//从小到大输出
System.out.println(java.util.Arrays.toString(arr));
}
Ⅶ 我是计算机科学与技术专业的学生,想问问前辈们,毕业设计做什么项目啊
当时我们辅导员给的有100多个题目呢,当时我做的是网站开发,我好多同学做的都是图书馆管理系统和餐饮管理系统。
要说你们学校网站 计科系上面应该发布的有题目的。下面是我们当时给的题目
1--住宅小区智能化物业管理系统总体设计-
2--网上测评系统的设计-
3--基于web网站的综合考评系统的设计-
4--基于web网站的考试系统设计-
5--网上教育资源库系统的设计-
6--浅谈网络协议的选用对网络性能的影响-
7--高校校园网信息管理平台研制-
8--实验室管理信息系统设计与实现-
9--基于互联网的学习课件的研制-
10--基于环联网的辅导答疑系统研制-
11--智能网络入侵检测技术初步研究-
12--电子政府信息处理总体实现架构研究-
13--企业管理信息系统设计与实现-
14--人事管理信息系统设计与实现-
15--学生信息管理系统设计与实现-
16--职工信息系统设计与实现-
17--职工工资管理系统设计与实现-
18--客房管理系统设计与实现-
19--中学考试管理信息系统设计与实现-
20--自学考试管理系统设计与实现-
21--超市管理系统设计与实现-
22--考试管理系统-
23--考务管理信息系统-
24--高校数学试题库-
25--拓扑排序算法的改进(给出AOV网的所有拓扑有序序列)-
26--哈希函数构造方法研究-
27--试卷自动生成系统设计-
28--自动检测系统设计-
29--教学中常见表现手法在AW平台上的实现-
30--教学中常见表现手法在PPT平台上的实现-
31--多媒体课件制作中的跨平台操作-
32--个人网络设计-
33--单片机时间控制器开发-
34--单片机通用数据采集和处理系统-
35--数据库系统开发-
36--网页制作-
37--网络数据库开发-
38--试题库软件设计-
39--图书馆管理系统-
40--学籍管理系统--
41--基于教学型软件的设计与实现-
42--基于练习型交互软件的设计与实现-
43--基于游戏型学习软件的设计与实
44--VC实现windows文件管理-
45--单片机与微机通信-
46--单片机与红外技术-
47--电子阅览室收费系统-
48--用户登陆与权限管理子系统-
49--网络环境中的数据共享问题的分析与对策-
50--Unix与Windows NT网络互联技术-
51--单片机控制的CO2焊机的设计(mcs-51系列)-
52--单片机控制的点焊控制器设计(mcs-51系列)-
53--利用网络实现互动功能
54--利用网络实现管理功能
56--如何防止IP地址盗用-
57--局域网主干网络的选型-
58--动态网站设计-
59--企业物流管理-
60--药品管理-
61--单片机遥控技术-
62--单片机与通讯-
63--家用电器与单片控制-
64--计算机教育教学探讨-
65--计算机硬件技术理解与应用-
66--计算机辅助教学理论与实践-
1 SMART芯片仿真器系统设计
2 程序执行结果模拟器
3 计算机硬件检测系统
4 图象处理软件
5 ITS信息平台的设计与分析
6 基于B/S的职工信息管理系统
7 iButton及其应用
8 工作备忘录的设计与实现
9 基于MATLAB数据仿真
10 基于Delphi的数据通信系统
11 **中学籍管理软件
12 动态网站制作
13 数据库信息管理系统
14 网站视频点播
15 24点游戏
16 趣味绘图
17 聊天程序
18 小学算术加减法教学软件设计
19 个人网页设计与友情连接
20 图像处理软件包
21 学生英语试题题库及判分系统软件设计
22 家庭理财管理信息系统设计
23 人事信息管理系统设计
24 计量管理信息系统
25 字符智能识别方法研究
25 基于图像分析的公路路面破损统计系统企业信息管理系统
27 VB数据采集系统设计
28 VC数据采集系统设计
29 虚拟仪器数据采集系统设计
30 光栅位移传感器原理图制作及仿真
31 网络搜索引擎性能分析系统模型及设计
32 基于短信的智能导行系统模型及设计
34 远程异步视频授课系统研究
35 规划设计中图形处理技术
36 计算机图形学在装饰设计中的应用
37 公路工程试验数据处理与分析(VB与Matlab)
38 城市信号交叉口禁左仿真
39 随机仿真模型
40 高等级公路新线中线坐标放样CAE
41 **大学上下水地下管网地理信息系统设计
42 油田测井数据绘图软件开发
42 企业管理系统
43 "**"课程的网络教学系统设计与开发
44 "**"课程试题库的设计
45 地球物理数据反演系统中的图形处理
46 电子教案中电路图的绘制方法研究
47 .NET实现Internet消息平台
48 远程打印及计费管理系统
49 机房无人值守系统
50 高速公路路网描述仿真模型构建
51 基于XML的数据交换在分布式WEB系统中的应用
52 基于关系数据库的OLAP研究
53 等值线自动生成方法及程序实现
54 基于LDAP的语音服务(IP电话)中心研究
55 人工智能多媒体教学软件
56 BUG系统的设计
57 教学管理系统
58 虚拟现实技术应用研究
60 客户管理系统
61 基于Web的教学系统设计与实现
62 信息工程学院资料室信息管理系统
63 基于网络的教材管理系统
64 石油工业仪器仪表质量监督检验中心网站设计
65 非线性流水线调度算法动态演示程序设计
66 存储体系地址映象及替换算法动态演示程序设计
67 医院药房管理系统
68 门诊划价收费系统
69 公交公司人事管理系统
70 固定资产管理系统
71 网上图书馆(在线浏览及在线查询)
72 工资计算系统
73 网上超市(电子商务网站的建设)
74 客户关系管理系统
75 旅游资源研发网的开发与设计
76 《****》试题库的设计
77 餐饮娱乐管理系统的开发与设计
78 文语转换系统
79 远程数据服务平台(网站设计,数据管理系统)
80 室外环境检测模拟平台(下分:控制台软件设计,网络传输程序,监测软件设计,硬件电路设计4个子题目)
81 图像识别技术(计算特定物体的个数,图像检索技术)
82 图像检索系统设计与开发
83 视频会议系统设计与开发
84 多媒体毕业纪念册及播放系统设计开发
85 网络媒体播放器设计与实现
86 《数据结沟》算法的动态演示
87 基于B/S结构的毕业设计题目管理系统
88 **大学计算机应用研究所网站
89 客户管理系统
90 设备管理系统
91 实验室管理系统
92 《多媒体软件设计技术》课程CAI的开发
93 新闻网页自动生成系统的开发
94 网站开发
95 电子白板的设计与实现
96 蚁群算法在动态TSP问题种的应用研究
97 基于Web的异步按需点播学习系统
98 多媒体同步实时授课系统中应用程序共享研究
99 协作编辑系统
100 基于web的远程测控制系统研究
101 基于B/S模式文献检索系统的设计与开发
102 在线课题项目选题系统的设计及实现
103 学生档案信息管理系统的开发
104 在线图书馆信息管理系统的设计及实现
105 浏览器过滤软件实现
106 基于局域网的IP数据包监控软件实现
107 WDM设备驱动程序开发-键盘过滤器
108 WDM设备驱动程序开发-鼠标过滤器
109 基于OpengGL的虚拟场景漫游软件设计
110 城市公交查询系统
111 J2EE框架的构建(Weblogic+JBuilder)
112 BrokerTool Project (C/S 结构)
113 多媒体开发与应用(Java2D,Java3D,JMF,Java图形制作与动画设计)
114 计算机辅修远程教学系统设计与实现
115 《操作系统》典型算法实现
116 "***"网站设计与实现
117 门禁管理系统实现
118 计算机系网站设计及建设
119 基于Internet的网络教学系统
120 视频点播系统
121 基于Internet的车辆管理、调度系统
122 武装工作管理系统
123 门禁式网络机房计费系统
124 成人教育学生档案及成绩管理系统
125 汽车综合性能工位测控系统设计与软件实现
126 汽车制动性能虚拟检测仪器设计与软件实现
127 基于LAN的汽车性能微机检测系统
128 汽车制动信号数字滤波及曲线拟合优化方法研究
129 动态存储器的刷新
130 电磁机构的计算机设计
131 服务器端安全监控软件的设计
132 校园网络地址管理模型的设计与实现
Ⅷ 关键路径怎么求求详解。
关键路径的算法是建立在拓扑排序的基础之上的,这个算法中用到了拓扑排序。
1. 什么是拓扑排序?
举个例子先:一个软件专业的学生学习一系列的课程,其中一些课程必须再学完它的基础的先修课程才能开始。如:在《程序设计基础》和《离散数学》学完之前就不能开始学习《数据结构》。这些先决条件定义了课程之间的领先(优先)关系。这个关系可以用有向图更清楚地表示。图中顶点表示课程,有向边表示先决条件。若课程i是课程j的先决条件,则图中有弧<i,j>。若要对这个图中的顶点所表示的课程进行拓扑排序的话,那么排序后得到的序列,必须是按照先后关系进行排序,具有领先关系的课程必然排在以它为基础的课程之前,若上例中的《程序设计基础》和《离散数学》必须排在《数据结构》之前。进行了拓扑排序之后的序列,称之为拓扑序列。
2. 如何实现拓扑排序?
很简单,两个步骤:
1. 在有向图中选一个没有前驱的顶点且输出。
2. 从图中删除该顶点和以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。
3. 什么是关键路径?
例子开头仍然,图1是一个假想的有11项活动的A0E-网。其中有9个事件v1,v2......,v9,每个事件表示在它之前的活动一完成,在它之后的活动可以开始。如v1表示整个工程的开始,v9表示整个工程结束,v5表示a4和a5已完成,a7和a8可以开始。与每个活动相联系的数是执行该活动所需的时间。比如,活动a1需要6天,a2需要4天。
packagegraph;
importjava.util.*;
publicclassGrph_CriticalPath
{
Graph_AdjListadjList;
Stack<Integer>T=newStack<Integer>();
intve[];
intvl[];
finalintmax=10000;
publicGrph_CriticalPath(Graph_AdjListadjList)//图的存储结构是用的邻接表
{
this.adjList=adjList;
intlength=adjList.vetexValue.length;
ve=newint[length];
vl=newint[length];
for(inti=0;i<length;i++)
{
ve[i]=0;
vl[i]=max;
}
}
publicvoidgetCriticalPath()
{
topologicalOrder();
intt=T.pop();
T.push(t);
vl[t]=ve[t];
while(!T.isEmpty())
{
intj=T.pop();
for(Graph_AdjList.ArcNodep=adjList.vetex[j].firstArc;p!=null;p=p.next)
{
intk=p.adjvex;
if(vl[k]-p.weight<vl[j])
{
vl[j]=vl[k]-p.weight;
}
}
}
for(inti=0;i<ve.length;i++)
{
for(Graph_AdjList.ArcNodep=adjList.vetex[i].firstArc;p!=null;p=p.next)
{
intk=p.adjvex;
intee=ve[i];
intel=vl[k]-p.weight;
if(ee==el)
{
System.out.print(i+","+k+"");
}
}
}
}
publicvoidtopologicalOrder()
{
Stack<Integer>S=newStack<Integer>();
S.push(0);
intcount=0;
while(!S.isEmpty())
{
intj=S.pop();
T.push(j);
count++;
Graph_AdjList.ArcNodep=null;
for(p=adjList.vetex[j].firstArc;p!=null;p=p.next)
{
intk=p.adjvex;
if(--adjList.degree[k]==0)
{
S.push(k);
}
if(ve[j]+p.weight>ve[k])
{
ve[k]=ve[j]+p.weight;
}
}
}
if(count<adjList.vetexValue.length)
{
System.out.println("图中存在环路!");
return;
}
}
publicvoidprint()
{
while(!T.isEmpty())
{
System.out.print(T.pop()+"");
}
}
publicvoidprintVel()
{
System.out.println();
for(inti=0;i<ve.length;i++)
{
System.out.print(ve[i]+"");
}
System.out.println();
for(inti=0;i<vl.length;i++)
{
System.out.print(vl[i]+"");
}
}
}
转自:http://blog.csdn.net/pigli/article/details/5777048
Ⅸ acm竞赛知识点
1. acm常用小知识点
acm常用小知识点 1.ACM 关于ACM程序设计竞赛,需要掌握哪些知识点,最好能详细一
训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上。
下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简) 7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多,慢慢掌握. 9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。
如: 1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树,二进制法等。
7.最大团,最大独立集。 8.判断点在多边形内。
9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.第三阶段: 前两个阶段是打基础,第三阶段是锻炼在比赛中可以快速建立模型、想新算法。这就要平时多做做综合的题型了。
1. 把oibh上的论文看看(大概几百篇的,我只看了一点点,呵呵)。 2. 平时扫扫zoj上的难题啦,别老做那些不用想的题.(中大acm的版主经常说我挑简单的来做:-P ) 3. 多参加网上的比赛,感受一下比赛的气氛,评估自己的实力. 4. 一道题不要过了就算,问一下人,有更好的算法也打一下。
5. 做过的题要记好 :-)下面转自:ACMer必备知识(任重而道远。)
图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配 最优匹配 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定组合数学 解决组合数学问题时常用的思想 逼近 递推 / 动态规划 概率问题 Polya定理计算几何 / 解析几何 计算几何的核心:叉积 / 面积 解析几何的主力:复数 基本形 点 直线,线段 多边形 凸多边形 / 凸包 凸包算法的引进,卷包裹法 Graham扫描法 水平序的引进,共线凸包的补丁 完美凸包算法 相关判定 两直线相交 两线段相交 点在任意多边形内的判定 点在凸多边形内的判定 经典问题 最小外接圆 近似O(n)的最小外接圆算法 点集直径 旋转卡壳,对踵点 多边形的三角剖分数学 / 数论 最大公约数 Euclid算法 扩展的Euclid算法 同余方程 / 二元一次不定方程 同余方程组 线性方程组 高斯消元法 解mod 2域上的线性方程组 整系数方程组的精确解法 矩阵 行列式的计算 利用矩阵乘法快速计算递推关系 分数 分数树 连分数逼近 数论计算 求N的约数个数 求phi(N) 求约数和 快速数论变换 …… 素数问题 概率判素算法 概率因子分解数据结构 组织结构 二叉堆 左偏树 二项树 胜者树 跳跃表 样式图标 斜堆 reap 统计结构 树状数组 虚二叉树 线段树 矩形面积并 圆形面积并 关系结构 Hash表 并查集 路径压缩思想的应用 STL中的数据结构 vector deque set / map动态规划 / 记忆化搜索 动态规划和记忆化搜索在思考方式上的区别 最长子序列系列问题 最长不下降子序列 最长公共子序列 最长公共不下降子序列 一类NP问题的动态规划解法 树型动态规划 背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向线性规划常用思想 二分 最小表示法串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论排序 选择/冒泡 快速排序 堆排序 归并排序 基数排序 拓扑排序 排序网络。
2.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
3.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
4.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
5.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
6.ACM常用的经典算法
大概分为数论算法,图论算法,A*算法。
数论算法:
排序(选择,冒泡,快速,归并,堆,基数,桶排序等)
递归,回溯
概率,随机
公约数,素数
因数分解
矩阵运算
线性规划
最小二乘
微积分
多项式分解和级数
图论算法:
哈夫曼树(即最优二叉树)
哈希表
Prim,Kruskal算法(即最小生成树算法)
红黑树
a-B剪枝法
深、广度搜索
拓扑排序
强连通分量
Dijkstra,Bellman-Ford,Floyd-Warashall算法(最短路径算法)
计算几何(线段相交,凸包,最近点对)
A*算法:
动态规划
贪心算法
KMP算法
哈密顿回路问题
子集问题
博弈(极大极小值算法等)
7.参加ACM需要准备哪些知识
学ACM要熟练C语言的基础语法,对编程有很大的兴趣,还要学关于数据结构的知识。
内容大多数是考数据结构,例如:深度搜索(dfs)、广度搜索(bfs)、并查集、母函数、最小生成树、数论、动态规划(重点)、背包问题、最短路、网络流……还有很多算法,我列出这些是经常考到的,我也在学习上述所说的。 最好买一本《数据结构》或者关于算法的书看看,看完一些要自己动手实践做题,做题的话去杭电acm做题,里面有很多很基础的题,不错的。
资料的话,网络有很多,我多数都是网络或者 *** ,还有可以看看别人的博客的解题报告,里面有详细的介绍,不懂还可以问问同学师兄的。 对了,还有一点,acm比赛都是英文题目的,比赛时带本字典查吧。
希望我说的你能满意,祝你能在acm方面有所收获。
Ⅹ 拓扑排序排课表
信息工程系软件技术学生课程表(拓扑排序)
拓扑图为:(图不好粘贴)
运用拓扑概念排序的结果:
C1 , C9 , C3 , C2 , C7 , C4, C5 , C8 , C6
C1计算机应用基础 C2 C语言 C3 VB语言 C4 JSP C5数字逻辑电路 C6软件工程
C7计算机网络基础 C8 Java语言 C9计算机数学基础
/*-------------------------------主类-----------------------------*/
public class Navy1 {
public static void main(String[] args) {
topology(); //调用拓扑的构造方法
}
public static void topology() { //构造拓扑方法
/**
声明拓扑图中的元素
定义节点和节点之间的关系
Entry(a,b)a为b的前导
**/
Entry[] relations = { new Entry(9, 2), new Entry(3,7),
new Entry(7, 5), new Entry(5, 8), new Entry(8, 6),
new Entry(4, 6), new Entry(1, 3), new Entry(7, 4),
new Entry(9, 5), new Entry(2, 8) };
int n = 9;
int n1 = 9;
/*计算拓扑图中节点数*/
int[] count = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/*开辟内存空间*/
Node[] top = { null, null, null, null, null, null, null, null, null, null };
Node p = null;
for (int i = 0; i < relations.length; i++) {
count[relations[i].k]++;
p = new Node();
p.suc = relations[i].k;
p.next = top[relations[i].j];
top[relations[i].j] = p;
}
int r = 0;
int[] qlink = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int i = 1; i <= n; i++) {
if (count[i] == 0) {
qlink[r] = i;
r = i;
}
}
int f = qlink[0];
System.out.println("题目及要求:");
System.out.println("课程排课程序。写一个程序,实现对某个专业的课程进行排课的功能。");
System.out.println("已知某专业的课程和它们的前导和后续关系(以有向图的形式表示),");
System.out.println("请用拓扑排序算法求出这些课程的优先关系并输出一种排课结果");
System.out.println("--------------------------------------");
System.out.println("08信息工程系软件技术课程表(拓扑排序)");
while (true)
{
System.out.println(f);
if (f == 0) //结束条件
{
break;
}
else
{
n1--;
p = top[f];
while (true)
{
if (p == null)
{
break;
}
else
{
count[p.suc]--;
if (count[p.suc] == 0)
{
qlink[r] = p.suc;
r = p.suc;
}
p = p.next;
}
}
f = qlink[f];
}
}
System.out.println("结束的标志为:" + n1);
System.out.println("--------------------------------------------");
System.out.println("注释(数字对应的课程):");
System.out.println("1 计算机应用基础 2 C语言 3 VB语言 ");
System.out.println("4 JSP 5 数字逻辑电路 6 软件工程");
System.out.println("7 计算机网络基础 8 Java语言 9 计算机数学基础");
System.out.println("--------------------------------------------");
}
/*构造元素类*/
private static class Entry
{
public Entry(int begin, int end) //定义开始元素和结束元素
{
this.j = begin;
this.k = end;
}
int j;
int k;
}
/*声明节点的后继*/
private static class Node
{
public Node(int suc, Node next)
{
this.suc = suc;
this.next = next;
}
public Node()
{
}
int suc;
Node next;
}
}