菜鸟问文件读取问题!dijkstra双向算法!

问题描述

小弟最近在研究dijkstra双向算法,原来是用C++设计的,运行成功。然后老师要求做界面,改成用C#编写,然后就不行了。大部分东西没有改,只是将一些写法改成了符合C#的格式,但是运行后(错误已全部调试完毕),点击“最短路径”后程序无反应,CPU100%,应该是进入了死循环,小弟怀疑在读取存着路径值的文件S2.txt时候出错,小弟C#比较烂,各位大哥大姐帮小弟看看吧,多谢了!下面是程序:privatevoidbutton1_Click(objectsender,EventArgse){constintN=30;inta=0,s=0,l=0,i=0,j=0,oper1=0,oper2=0,k=0,t=0,p=0,times=0;//s为起始节点,l为终止节点,oper为当时的工作节点doublemin1=0,min2=0;int[]num=newint[N];double[,]d=newdouble[N,N];double[,]S=newdouble[N,N];//d[n][n]表示两节点间最短路径的长度,用10000表示无穷大;S[n][n]表示邻接两点之间路程的权,V[n][n]是指速度的权,10000表示无穷大s=Convert.ToInt32(this.textBox1.Text);if(s>N||s<0)MessageBox.Show("请输入0-30内的数!");l=Convert.ToInt32(this.textBox2.Text);if(l>N||l<0)MessageBox.Show("请输入0-30内的数!");/*......以下for循环用于读入图......*/stringfile=@"d:S2.txt";StreamReadersr=newStreamReader(file);stringline;line=sr.ReadLine();string[]splits=newstring[1000];while(line!=null){if(!line.Equals("")){splits=line.Split(newchar[]{'','t','n'});}}intr=0;for(i=0;i<N;i++)for(j=0;j<N;j++)S[i,j]=Convert.ToDouble(splits[r++]);int[]con=newint[N];int[]sig=newint[N];int[]sog=newint[N];int[]don=newint[N];//用con[n]表示n号节点的上一节点,sig[n]=-1表示已经n号节点当过工作节点for(i=0;i<N;i++)//初始化所有节点间的最短路径长度for(j=0;j<N;j++)d[i,j]=10000;for(i=0;i<N;i++)//使所有节点都为临时节点{sig[i]=0;sog[i]=0;}for(i=0;i<N;i++)d[i,i]=0;con[s]=-1;don[l]=-1;//表示起始节点无上一节点sig[s]=-1;sog[l]=-1;//表示起始节点正成为工作节点oper1=s;oper2=l;//让工作节点为起始节点times=0;booltru=true;while(tru)//开始搜索最短路径{k=oper1;t=oper2;//记录工作节点便于后边判断是否还有能成为工作节点的节点for(i=0;i<N;i++)//此循环用于确定与工作节点邻接的临时节点的最短路径和它们的上一节点{if(S[oper1,i]<10000&&sig[i]==0){if(d[oper1,s]+S[oper1,i]<d[i,s]){d[i,s]=S[oper1,i]+d[oper1,s];con[i]=oper1;}}if(S[oper2,i]<10000&&sog[i]==0){if(d[oper2,l]+S[oper2,i]<d[i,l]){d[i,l]=S[oper2,i]+d[oper2,l];don[i]=oper2;}}times++;}for(i=0;i<N;i++)//以下两个for循环用于确定下一工作节点if(d[i,s]!=-1&&sig[i]==0){min1=d[i,s];oper1=i;break;}for(i=0;i<N;i++)if(d[i,l]!=-1&&sog[i]==0){min2=d[i,l];oper2=i;break;}for(i=0;i<N;i++){if(sig[i]==0&&d[i,s]!=-1&&d[i,s]<min1){min1=d[i,s];oper1=i;}if(sog[i]==0&&d[i,l]!=-1&&d[i,l]<min2){min2=d[i,l];oper2=i;}}if(oper1==k||oper2==t){this.textBox3.Text="没有最短路径!";break;}for(i=0;i<N;i++)if(con[i]==oper2||don[i]==oper1)gotoshuchu;//如果其中有接上的,则说明已经找到工作节点了{sig[oper1]=-1;sog[oper2]=-1;}//否则则使新的工作节点表示为-1以区别于临时节点}/*输出最短路径*/shuchu:stringmsg="";if(con[i]==oper2){d[l,s]=d[oper2,s]+d[oper2,l];p=i;do{p=con[p];num[a++]=p;}while(p!=s);while(--a>=0)msg+=num[a]+"-";p=don[oper2];while(p!=-1){msg+=p+"-";p=don[p];}}elseif(don[i]==oper1){d[l,s]=d[oper1,l]+d[oper1,s];p=oper1;do{p=con[p];num[a++]=p;}while(p!=s);while(--a>=0)msg+=num[a]+"-";p=oper1;while(p!=-1){msg+=p+"-";p=don[p];}}this.textBox3.Text=msg;this.textBox4.Text=Convert.ToString(d[l,s]);}

解决方案

解决方案二:
S2是一些值,某点到某点的直接距离,假如这两点没有直接相连,就设为10000

时间: 2024-10-24 18:35:55

菜鸟问文件读取问题!dijkstra双向算法!的相关文章

数据结构算法-菜鸟问,二叉树的非递归遍历问题

问题描述 菜鸟问,二叉树的非递归遍历问题 二叉树的非递归遍历跟着代码走一遍可以看懂是怎么实现的,想问一下利用栈非递归实现遍历是怎么想到的,代码是怎么来的呢 解决方案 我理解你的问题,意思是想问二叉树遍历是怎么出来这种算法的?,这是一个叫哈弗曼的人首先提出的二叉树概念,你要是想追溯本源就去了解他.. 我觉得学算法,_最主要就是要瞄准算法怎么解决问题,而不是去讨论起源,_ 就好比牛顿发现了行星轨道之间运转的规律--万有引力,,但是并不清楚为啥是遵循这样运动的.... 解决方案二: 我觉得你应该先把二

c语言 算法 文件读取-C语言文件读取遇到的问题

问题描述 C语言文件读取遇到的问题 原题是:输入一个正整数n,然后读取n个正整数,最后再读取一个正整数m,统计有多少整数小于m.代码如下, int main() { FILE *fin,*fout; fin = fopen("data.in","rb"); fout = fopen("data.out","wb"); int n,x,m,i,count = 0; fscanf(fin,"d",&n)

http服务器-http 服务器 流文件读取问题

问题描述 http 服务器 流文件读取问题 对http这块不了解,请教下各位大神.情况是这样的:1,我用C#的一个media player控件播放http服务器的mp3,给控件设置MP3的url路径后,控件会发送一个http请求给服务器,服务器将整首mp3文件下发给控件:这个正常运行:2,这个下发的过程,一个6M的MP3,控件用了50s才下载完成:是在同一台电脑,http服务器是用IIS.出现50s下载完成的情况,我估计是这个控件接收慢,并不是网络慢,我自己写测试代码读取服务器上的mp3文件,1

新手菜鸟问一下spinner右侧箭头按钮下拉怎么做?

问题描述 新手菜鸟问一下spinner右侧箭头按钮下拉怎么做? spinner下拉菜单,点击右侧小箭头按钮出现的下拉菜单选项?该怎么做?求大神指点? 解决方案 首先在xml文件的spinner属性中增加android:requiresFadingEdge="none",android:spinnerMode="dropdown"这2个属性,然后给spinner绑定适配器的时候SpinnerAdapter styleAdapter = new SpinnerAdapt

c语言-C语言文件读取的问题。

问题描述 C语言文件读取的问题. #include int main() { int n; FILE *fp; FILE *qw; int i; int j; qw=fopen("out.txt","w"); fp=fopen("Din.txt","r"); fscanf(fp,"%d",&n); if (fp==NULL) { printf("n文件打开失败!n"); } fo

菜鸟问mfc串口捕获异常的写法

问题描述 菜鸟问mfc串口捕获异常的写法 在看别人写的一段串口程序,对串口状态设置之后对异常的捕获为什么是这样的,CMemoryException,CFileException这些异常为什么捕获之后就清空指针没有做其他处理,而CException不是所有异常吗,为什么不只写这个. bool CAAT_DriverDlg::OpenUart1(int comIndex) {//这一段是 判断是否打开串口1 CString strOut; g_hComWnd = AfxGetMainWnd()->m

c语言-C语言文件读取问题,求帮忙看看

问题描述 C语言文件读取问题,求帮忙看看 想用程序实现输入一个人姓名和电话号码并写入文件,然后读取显示文件中的数据. 但输出如图:输出最后两个重复,不知是哪里出错,求大神帮忙看看. 程序代码如下: #include #include #include #include typedef struct man { char name[20]; char first_name[20]; long phone_number; } man; int main(void) { FILE* pfile=NUL

php安装php_rar扩展实现rar文件读取和解压的方法_php技巧

本文实例讲述了php安装php_rar扩展实现rar文件读取和解压的方法.分享给大家供大家参考,具体如下: PHP Rar Archiving 模块 (php_rar) 是一个读取和解压rar文件的模块,但不提供RAR压缩(打包)的功能. 1.首先要到PECL的RAR页面下载DLL. 根据自己的情况选择下载对应版本的DLL. PHP版本要求:php_rar模块适用于php 5.2及以上, 不过对于windows系统,似乎只有php5.3 / 5.4对应的DLL下载. 2.下载到的是个zip包,将

对象-JAVA 菜鸟 问一个菜鸟问题 list 的排序问题

问题描述 JAVA 菜鸟 问一个菜鸟问题 list 的排序问题 简化一下 list 情况 比如 一个 student 类 只有两个参数 学号 sno 和 成绩 grade 现全放入 ArrayList中 如何按成绩 将 学生对象排序 实现目标如下即可 002 97 003 95 001 90 求各位路过大神 不吝指教后生 解决方案 先自己定义一个对比的方法类 class MyIntComparator implements Comparator{ public int compare(Objec