凸多边形是指所有内角大小都在 \(\left[ 0,\pi \right]\) 范围内的简单多边形。
凸包就是指在平面内能包含所有给定点的最小凸多边形叫做凸包。
可以以下面的例子来形象理解一下。
下面是一堆木桩,农夫约翰想要围成一个围栏,需要保证所有的木桩都在围栏内,但是约翰想尽量用少的花费。
显然我们围着最外面的木桩围起来是最优的
所以我们可以这么理解凸包:平面凸包是指覆盖平面上 \(n\) 个点的最小的凸多边形。
那我们怎么让程序围起最外面的木桩呢?
本质:
Graham 扫描算法维护一个凸壳,通过不断在凸壳中加入新的点和去除影响凸性的点,最后形成凸包。
凸壳就是凸包的一部分。
我们的 Graham 算法的第一步就是对点集进行排序,这样能保证其有序性,从而在后续的处理中更高效。
我们首先先择一个 \(y\) 值最小(如有相同选 \(x\) 最小)的点,记为 \(p_{1}\)。
剩下点集中按照极角的大小逆时针排序,然后编号为 \(p_{2}-p_{m}\)
我们按照排序结束时的顺序枚举每一个点,依次连线,这里可以使用一个栈来存储,每次入栈,如果即将入栈的元素与栈顶两个元素所构成了一个类似于凹壳的东西,那么显然处于顶点的那个点一定不在这个点集的凸包上,而他正好在栈顶,所以把它弹出栈,新点入栈。
但是,新来的点有可能既踢走了栈顶,再连接新的栈顶元素后却发现仍然可以踢出,此时就不能忘记判断。
总的时间复杂度为 \(O(n\log n)\)
对所有点进行排序,以 \(x\) 为第一关键字,以 \(y\) 为第二关键字。第 \(1,n\) 两个点一定在凸包上。
先顺序枚举所有点,求下凸包。用栈来维护当前在凸包上的点;新点入栈前,总要判断该弹出哪些旧点。只要新点处在由栈顶两点构成的有向直线的右侧或共线,就弹出旧点。不能再弹出的时候,新点入栈。
逆序枚举所有点,求上凸包,用栈维护,和上面一样。
总时间复杂度为 \(O(n\log n)\)。
其实共线的点是不用删的,但是后面计算距离的时候枚举会变多,虽然差不了多少
code:
#include<bits/stdc++.h>
#define int long long
#define DB double
#define N 1000100
using namespace std;
int n,top;
struct sb{DB x,y;}e[N],stk[N];
inline DB cross(sb a,sb b,sb c){return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}
inline DB js(sb a,sb b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline int cmp(sb a,sb b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}
inline DB Andrew()
{
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++)
{
while(top>1&&cross(stk[top-1],stk[top],e[i])<=0)top--;
stk[++top]=e[i];
}
int t=top;
for(int i=n-1;i>=1;i--)
{
while(top>t&&cross(stk[top-1],stk[top],e[i])<=0)top--;
stk[++top]=e[i];
}
DB res=0;
for(int i=1;i<top;i++)res+=js(stk[i],stk[i+1]);
return res;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>e[i].x>>e[i].y;
DB ans=Andrew();
printf("%.2lf\n",ans);
return 0;
}
Convex Hull
这道题目也是一道模板,我们看到里面给了你哪些点是凸包的点,其实可以不用给,因为我们后面能求出来。
我们在算法上选择 Andrew 算法,因为最后要求点从 \(x\) 最小的点开始逆时针输出,这不刚好是我们算法的入栈顺序吗。
这里就体现了手写栈的好处。
#include<bits/stdc++.h>
#define int long long
#define DB double
#define N 1000100
using namespace std;
int t,n,top;char c;
struct sb{DB x,y;}e[N],stk[N];
inline DB cross(sb a,sb b,sb c){return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}
inline DB js(sb a,sb b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline int cmp(sb a,sb b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}
inline void Andrew()
{
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++)
{
while(top>1&&cross(stk[top-1],stk[top],e[i])<0)top--;
stk[++top]=e[i];
}
int t=top;
for(int i=n-1;i>=1;i--)
{
while(top>t&&cross(stk[top-1],stk[top],e[i])<0)top--;
stk[++top]=e[i];
}
}
signed main()
{
cin>>t;
while(t--)
{
top=0;
cin>>n;
for(int i=1;i<=n;i++)cin>>e[i].x>>e[i].y>>c;
Andrew();
cout<<top-1<<endl;
for(int i=1;i<top;i++)cout<<(int)stk[i].x<<" "<<(int)stk[i].y<<endl;
}
return 0;
}
参考自:http://www.luogu.com.cn/blog/ShineEternal/convex-hull
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路搜索树有这样一个特性,每个结点右侧节点值均大于该节点值,左侧结点值均小于该结点值. 从右向左遍历,先找出第一个小于根的索引即为左子树的根也就是左子树在该数组中最后一个结点,也是右子树开始结点的左侧结点. 由于之前找左子树最后一个结点的同时,我们已经按照规则假设了右子树都是上值都大于了根,我们只要遍历左子树,如果左子树上的值都小于根,则该结点没问题,我们继续遍历,直到遍历到叶子结点结束代码publicbooleanVerifySquenceOfBST(int[]sequence){ if(sequence.length==0) returnfalse; if(sequence.length==1) returntrue; returnjudge(sequence,0,sequence.length-1); } publicbooleanjudge(int[]sequence,intstart,intend){ if(start>=en
本文收录在个人博客:www.chengxy-nds.top,技术资源共享。之前不是做了个开源项目嘛,在做完GitHub登录后,想着再显得有逼格一点,说要再加个人脸识别登录,就我这佛系的开发进度,过了一周总算是抽时间安排上了。源码在文末其实最近对写文章有点小抵触,写的东西没人看,总有点小失落,好在有同行大佬们的开导让我重拾了信心。调整了自己的心态,只要我分享的东西对大家有帮助就好,至于多少人看那就随缘吧!废话不多说先看人脸识别效果动态,马赛克有点重哈,没办法长相实在是拿不出手。实现原理我们看一下实现人脸识别登录的大致流程,三个主要步骤:前端登录页打开摄像头,进行人脸识别,注意:只识别画面中是不是有人脸识别到人脸后,拍照上传当前画面图片后端接受图片并调用人脸库SDK,对人像进行比对,通过则登录成功,并将人像信息注册到人脸库和本地mysql。前端实现上边说过要在前端识别到人脸,所以这里就不得不借助工具了,我使用的tracking.js,一款轻量级的前端人脸识别框架。前端Vue代码实现逻辑比较简单,tracking.js打开摄像头识别到人脸信息后,对视频图像拍照,将图片信息上传到后台,等待图片
前言学过的知识点太容易忘记了,做个记录后续方便查询正题主要有三个内容Cmake链接三方so库文件拆分和合并NDK的线程Cmake链接三方so库在平常开发项目的时候常见的是引入三方的so库,然后java调用已经给好的api。如果需要在C++或者C中调用呢,Android的NDK开发,提供了CMake,将三方的so库,动态链接到我们的项目。 这边以一个简单的例子在C++代码调用so的api 项目结构.png步骤:将三方so库copy到项目的libs(如果copy到jnilibs下是不需要配置) 如果将so包复制到module下的libs,需要在build.gradle配置android{ .............省略代码............ sourceSets{ main{ jniLibs.srcDirs=['libs'] jni.srcDirs=[] } } }复制在CMakeList.txt配置三方so包,并且链接到当前项目cmake_minimum_required(VERSION3.4.1) #设置so库路径 set(my_lib_path${CMAK
前言3D可视化,就是把复杂抽象的数据信息,以合适的视觉元素及视角去呈现,方便系统的展示、维护和管理。而在可视化系统的搭建选择上,所呈现的风格样式效果多种多样,各自所突出的适用场合也不尽相同。对于科技风格上的体现,线框模式可能是最具有代表性意义的实现方式之一。机房数据可视化的管控维护的实现上,在工业互联网的推动下,体现的维护数据和系统搭建也越来越多样化,而Hightopo(以下简称HT)的HTforWeb产品上的有着丰富的组态化可供选择,本文将介绍如何运用HT丰富的2/3D组态搭建出一个线框楼宇可视化机房的解决方案。界面简介及效果预览主页面的呈现上以线框的科技风格为主的大楼设计,大楼环绕着数字飞升的光柱,场外分布着车流穿梭效果和停车场的模拟实现,其中数据中心上有着许多个设备的展示处理以及设备的预警处理,主体办公大楼侧边并列呈现着楼层的分布——办公楼层场景以及机房楼层场景;切换到内场景中的机房场景,展示了机房设备群的排列,单击选中机柜会视角转化到此设备上,并且虚化周围设备,展示出所点击的机柜信息,同时还具备一键切换查看机柜的利用率信息;另外一个内场景办公室,则起到了展示日常办公的应用场景,
排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:时间复杂度与空间复杂度关于时间复杂度:平方阶(O(n2))排序各类简单排序:直接插入、直接选择和冒泡排序。线性对数阶(O(nlog2n))排序快速排序、堆排序和归并排序;O(n1+§))排序,§是介于0和1之间的常数。希尔排序线性阶(O(n))排序基数排序,此外还有桶、箱排序。关于稳定性:稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。1.冒泡排序1.1算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。1.2动画演示冒泡排序动画演示1.
项目涉及文档处理,用户上传的包括zip和rar压缩包,需要先将压缩包解压后再作处理。对于zip压缩包,由于php自带zip扩展,可以直接解压。解压zip压缩包:$file="/opt/data/upload/testfile.zip"; $outPath="/opt/data/upload/testfile"; $zip=newZipArchive(); $openRes=$zip->open($file); if($openRes===TRUE){ $zip->extractTo($outPath); $zip->close(); }复制对于rar压缩包,需要先为php安装rar扩展。安装rar扩展:wgethttp://pecl.php.net/get/rar-4.0.0.tgz gunziprar-4.0.0.tgz tar-xvfrar-4.0.0.tar cdrar-4.0.0 phpize ./configure&&make&&makeinstall #报错 configure:err
电影《流浪地球》讲述的是太阳不断膨胀,即将吞没地球,地球不得不寻找新的太阳以筹建新家园的故事。在遍布全球的数以万计的推进器的联合推动下,地球开始了长达2500年的流浪之旅。这一幕则在中国互联网市场上上演。互联网热度的持续减退,以互联网技术为主要驱动力的商业模式的不断退潮都在让人们不得不离开互联网的太阳系,去寻找能够让他们继续生存和发展的下一个“太阳”。可以预见的是,以AI(A)、区块链(B)、云计算(C)、大数据(D)为代表的新技术将会成为给互联网行业带来新的驱动力的“新太阳”。在寻找“新太阳”的过程当中,中国的互联网行业同样开启了漫长的流浪。在这场流浪的旅程中,互联网同样会遭遇类似影片《流浪地球》里类似推进器熄火、木星撞击地球的惊险场面。但是,这并不能阻挠中国互联网有和《流浪地球》一样的未来。勇敢的创业者们会像刘培强和刘启们一样勇往直前,不断寻找破解互联网的“木星之困”,当一切化险为夷之后,中国的互联网同样将会和影片《流浪地球》一样继续流浪,直到找到能够让自己基于焕发生机与活力的下一个“新太阳”。缘起:互联网的太阳正在消亡同影片《流浪地球》里的地球一样,借助太阳,人类创造了无比灿烂的
1Xcode中出现的问题1.Xcode7.1中关于bitcode的问题升级到Xcode7.1后,在模拟器下编译通过,但是切换到真机编译遇到如下问题 AEE851A3-CFC3-404C-B795-2B8D13992529.png 解决办法如下: C2E64E66-27F2-4B53-AB2C-1A54ECFB524D.png xcode7.1默认bitcode为Yes,真机测试的时候不能通过的话,将Yes改为No就可以了.2.ld:warning:directorynotfoundforoption'-F/Users/XXPaste_Image.png解决方式,修改一下对已ing的路径3.默认点击tableViewCell后会出现灰色背景,并且不消失.解决方法:点击UITableViewCell时,没有点击效果,在cellForRowAtIndexPath:方法中写上 cell.selectionStyle=UITableViewCellSelectionStyleNone;点击UITableCell时,Cell背景颜色不变,但是上面自定义的控件如:U
转载声明:本文转载自「EAWorld」,搜索「eaworld」即可关注。原文标题:TheGravityofKubernetes原文作者:JeffMeyerson普元云计算架构师宋潇男点评:Kubernetes已在容器编排之战中取胜,未来很可能会成为“多云”之上的标准层,进而为分布式系统的分发和运行带来根本性的改变,而其自身则会慢慢变得像LinuxKernel一样,成为一种系统底层的支撑,不再引人注目。 原文的标题是TheGravityofKuberrnetes,但是从内容上看,更像是近些年流行的“XXXisdead.LongliveXXX.”的风格,所以在翻译标题的时候我们恶搞了一下。本文金句:通过Kubernetes,分布式系统工具将拥有网络效应。每当人们为Kubernetes制作出的新的工具,都会让所有其它工具更完善。因此,这进一步巩固了Kubernetes的标准地位。云提供商并非可替换的商品。不同的云提供的服务会变得越来越独特和不同。如果可以访问不同的云提供商提供的不同服务,那么企业将因此受益。当多节点应用与单节点应用一样可靠时,我们将看到定价模型的变化。这就是为什么我会被Kub
In-Q-Tel是美国顶级间谍机构—中央情报局(CIA)下属的风险投资公司,近期投资了热门云计算创业企业Mesosphere和Docker,投资金额未披露。Mesosphere和Docker是两家资金比较充裕的旧金山创业企业,两家公司估值接近或超过10亿美元。CIA对这两家公司感兴趣的原因,我们只能猜测。但是中央情报局确实投资了很多企业级软件公司,包括神秘的数据挖掘企业Palantir。该报告还强调Mesosphere和Docker此前都曾和政府机构有过业务往来。Mesosphere和美国财政部的项目金额为9万美元。Docker则和消费者金融保护局有技术合作,其是后者唯一的技术提供方。他们之间的项目是公开的,但并没有受到广泛关注。最近,Mesosphere融资7350万美元,惠普领投,同时微软作为重要的合作投资方。Mesosphere公司其他的投资机构还包括著名的硅谷风险投资公司AndreessenHorowitz和KhoslaVentures.Docker最近的融资是在2015年4月,当时融资规模为9500万美元,后来11月又融资1800万美元。Docker公司的投资机构包括高盛和红
1Linux的发行版有很多,这里罗列7个漂亮的Linux发行版,可以说是Linux操作系统界的颜值担当了。01elementaryOS网站:https://elementaryos.cn elementaryOS操作系统是最漂亮的Linux发行版之一。它基于macOS外观,同时为Linux用户提供了出色的用户体验。如果用户已经习惯使用macOS,则使用elementaryOS不会有任何问题。 另外,elementaryOS操作系统基于Ubuntu,因此用户也可以轻松找到大量应用程序来完成任务。 elementaryOS不仅限于外观,而且在不断的改进。因此,用户体验会随着每次更新而改善。 02Deepin网站:https://www.deepin.orgDeepin是另一个漂亮的Linux发行版,最初基于Debian的稳定分支。动画(外观)可能有些让人不知所措-但看起来很漂亮。它具有自己的Deepin桌面环境,其中包含多种基本功能,以实现最佳的用户体验。它可能不完全类似于其他任何发行版的UI,但使用起来比较容易习惯。03Pop!_OS网站:https://system76.com/
在图层上点击某个位置,有个气泡弹出,里面有相关具体信息。好酷哟,怎么实现呢? 我粗浅地了解到,这是一种“要素图层”,FeatureLayer,有相关的相应方法。ArcGIS的图层可分为以下几种: 参考文章: ArcGIS图层介绍 其实呢,在ArcGIS里面,我目前的理解(可能是错的),所有的图层都是要素图层,而弹出气泡效果,关键是代码里如何操作。举个栗子, //加载“普通”图层 functionbuildLayerList(){ layer=newesri.layers.ArcGISDynamicMapServiceLayer("http://WIN-NH9JATPNTFA:6080/arcgis/rest/services/ZT/MapServer"); layer.setVisibleLayers(visible,true);//visible是一个数组,元素是待显示图层的ID map.addLayer(layer); } //加载要素图层 functionbuildFeatureLayer(){ varurlOp="http://WIN-NH9JATPNTFA:6080/
论文地址: MobileNets:EfficientConvolutionalNeuralNetworksforMobileVisionApplicationsarxiv.org MobileNet的核心就是Depthwiseseparableconvolution(深度可分离卷积),它将一般的卷积过程分为了depthwiseconvolution(逐深度卷积)和pointwiseconvolution(逐点卷积),在损失一点精度的情况下,计算量大幅下降,速度更快,模型更小。 先来看看一般的卷积过程,如下图: 输入 的图像,即 ,使用 的卷积核, ,无 ,则卷积后,输出 的图像。 为了得到下图 的输出: 那么就需要256个卷积核(一个卷积核输出一个channel),因此总的计算量就为 ,即一个卷积核要在输入图像上滑动 个位置,每个位置进行 &n
本文是PLY(PythonLex-Yacc)的中文翻译版。转载请注明出处。这里有更好的阅读体验。 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不会陌生,PLY是DavidBeazley实现的基于Python的lex和yacc。作者最著名的成就可能是其撰写的PythonCookbook,3rdEdition。我因为偶然的原因接触了PLY,觉得是个好东西,但是似乎国内没有相关的资料。于是萌生了翻译的想法,虽然内容不算多,但是由于能力有限,很多概念不了解,还专门补习了编译原理,这对我有很大帮助。为了完成翻译,经过初译,复审,排版等,花费我很多时间,最终还是坚持下来了,希望对需要的人有所帮助。另外,第一次大规模翻译英文,由于水平有限,如果错误或者不妥的地方还请指正,非常感谢。 目录 1前言和预备 2介绍 3PLY概要 4Lex 4.1Lex的例子 4.2标记列表 4.3标记的规则 4.4标记的值 4.5丢弃标记 4.6行号和位置信息 4.7忽略字符 4.8字面字符 4.9错误处理 4.10构建和使用lexer 4.11@TOKEN装饰器 4.12优化模式 4.
多节点redis实现的分布式锁算法(RedLock):有效防止单点故障 假设有5个完全独立的redis主服务器 1.获取当前时间戳 2.client尝试按照顺序使用相同的key,value获取所有redis服务的锁,在获取锁的过程中的获取时间比锁过期时间短很多,这是为了不要过长时间等待已经关闭的redis服务。并且试着获取下一个redis实例。 比如:TTL为5s,设置获取锁最多用1s,所以如果一秒内无法获取锁,就放弃获取这个锁,从而尝试获取下个锁 3.client通过获取所有能获取的锁后的时间减去第一步的时间,这个时间差要小于TTL时间并且至少有3个redis实例成功获取锁,才算真正的获取锁成功 4.如果成功获取锁,则锁的真正有效时间是TTL减去第三步的时间差的时间;比如:TTL是5s,获取所有锁用了2s,则真正锁有效时间为3s(其实应该再减去时钟漂移); 5.如果客户端由于某些原因获取锁失败,便会开始解锁所有redis实例;因为可能已经获取了小于3个锁,必须释放,否则影响其他client获取锁 算法示意图如下: 什么是时钟漂移 如果redis服务器的机器时钟发生了向前跳跃,就会
GivenapalindromicstringoflowercaseEnglishletters palindrome,replace exactlyone characterwithanylowercaseEnglishlettersothattheresultingstringis not apalindromeandthatitisthe lexicographicallysmallest onepossible. Return theresultingstring.Ifthereisnowaytoreplaceacharactertomakeitnotapalindrome,returnan emptystring. Astring a islexicographicallysmallerthanastring b (ofthesamelength)ifinthefirstpositionwhere a and b&nb
使用label语句可以在代码中添加标签,以便将来使用。 以下是label语句的语法: label:statement复制 下面是一个示例: start:for(vari=0;i<count;i++){ alert(i); }复制 这个例子中定义的start标签可以在将来由break或continue语句引用。 加标签的语句一般都要与for语句等循环语句配合使用。 Break varnum=0; outermost: for(vari=0;i<10;i++){ for(varj=0;j<10;j++){ if(i==5&&j==5){ breakoutermost; } num++; } } alert(num);//55复制 在这个例子中,outermost标签表示外部的for语句。如果每个循环正常执行10次,则num++语句就会正常执行100次。 换句话说,如果两个循环都自然结束,num的值应该是100。但内部循环中的break语句带了一个参数:要返回到的标签。 添加这个标签的结果将导致break语句不仅会
1.先找到MySQL配置文件my.ini。使用文本编辑器打开。 2.[mysqld]节点下,将以下节点调整为如下值 log-output=FILE slow-query-log=1 long_query_time=10 slow_query_log_file="C:\ProgramData\MySQL5.x\xxxxxxxx-slow.log" 3.对以上节点,进行解释: log-output输出文件的格式,慢查询写日志,需要配置输出为FILE。 slow-query-log打开慢查询功能的开关,默认0为关闭,1为打开。 long_query_time查询时长,单位秒。当查询时长超过此值将会记录查询操作到日志文件中。 slow_query_log_file慢查询日志输出目录,包含文件路径和文件名。 4.重启MySQL服务,执行几条SQL语句监测配置是否生效。 eg:selectsleep(11); 5.注意慢查询日志文件所在目录一定要具有写入权限。 MySQL个别版本不同时,可能配置的参数名称会有变化,整体内容不变。
data= 订单号,不能超过15位,订单号一样代表一张票qq283117523发票类型qq283117523购货单位名称qq283117523购货单位纳税人识别号qq283117523购货单位地址电话qq283117523购货单位开户行和银行账号qq283117523货物或应税劳务名称qq283117523税收分类编码(19位)qq283117523规格型号qq283117523单位qq283117523数量qq283117523单价qq283117523含税标志qq283117523金额qq283117523税率qq283117523税额qq283117523收款人qq283117523复核人qq283117523开票人qq283117523备注qq283117523 1qq283117523专用发票qq283117523南京福加自动化科技有限公司qq283117523913201137681532158qq283117523南京市栖霞区龙潭街道工业园122025-85238797qq283117523招商银行迈皋桥支行253680791910001qq283117523谐
一、场景分析 操作系统是管理计算机硬件与软件资源的计算机程序,用于工作中的进程管理、存储管理、设备管理、文件管理、作业管理等,十分重要,安全等级极高! 二、问题分析 1、密码设置简单,非常容易被撞库破解; 2、密码设置复杂,非常容易忘记密码,增加网络管理员无意义工作; 3、设置统一或有规律的密码,一旦单点被破,极易引发全面危机; 4、定期更改密码,容易密码混淆,难以记住; 5、做密码本、存储位置容易泄漏,引发全面危机; 6、员工离职,需要修改密码,增加管理员工作量; 三、解决方法 采用CKEYDAS做密码加固,登录时需要做二次身份认证。实现效果如下: “用户名+静态密码+动态密码=成功登录 ” 四、Linux/Unix操作系统认证流程 认证前提: 1、在Linux/Unix上启动PamRadius或安装CKEYPamRadius组件; 2、和CKEYDAS认证服务器完成Radius对接; 登录流程: 1、用户输入“用户名+静态密