马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
<P ><B ><FONT size=3><FONT face=宋体>Floyd-Warshall算法:<BR> <BR>其源代码为:<p></p></FONT></FONT></B></P>
<P ><FONT face=宋体 size=3>#include<stdio.h></FONT></P>
<P ><FONT face=宋体 size=3>#include<stdlib.h></FONT></P>
<P ><FONT face=宋体 size=3>#include<limits.h></FONT></P>
<P ><FONT face=宋体 size=3>#define MAXSIZE 20</FONT></P>
<P ><FONT face=宋体 size=3>void Floyd(int [][MAXSIZE],int [][MAXSIZE],int);</FONT></P>
<P ><FONT face=宋体 size=3>void display_path(int [][MAXSIZE],int [][MAXSIZE],int);</FONT></P>
<P ><FONT face=宋体 size=3>void reverse(int [],int);</FONT></P>
<P ><FONT face=宋体 size=3>void readin(int [][MAXSIZE],int *);</FONT></P>
<P ><FONT face=宋体 size=3>#define MAXSUM(a,b) (((a)!=INT_MAX&&(b)!=INT_MAX)?((a)+(b)):INT_MAX)</FONT></P>
<P ><FONT face=宋体 size=3>void Floyd(int dist[][MAXSIZE],int path[][MAXSIZE],int n)</FONT></P>
<P ><FONT face=宋体 size=3>{ </FONT></P>
<P ><FONT face=宋体 size=3>int i,j,k;</FONT></P>
<P ><FONT face=宋体 size=3>for(i=0;i<n;i++)</FONT></P>
<P ><FONT face=宋体 size=3>for(j=0;j<n;j++)</FONT></P>
<P ><FONT face=宋体 size=3>path[j]=i;</FONT></P>
<P ><FONT face=宋体 size=3>for(k=0;k<n;k++)</FONT></P>
<P ><FONT face=宋体 size=3>for(i=0;i<n;i++)</FONT></P>
<P ><FONT face=宋体 size=3>for(j=0;j<n;j++)</FONT></P>
<P ><FONT face=宋体 size=3>if(dist[j]>MAXSUM(dist[k],dist[k][j]))</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>path[j]=path[k][j];</FONT></P>
<P ><FONT face=宋体 size=3>dist[j]=MAXSUM(dist[k],dist[k][j]);</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>void disp_path(int dist[][MAXSIZE],int path[][MAXSIZE],int n)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>int *chain;</FONT></P>
<P ><FONT face=宋体 size=3>int count;</FONT></P>
<P ><FONT face=宋体 size=3>int i,j,k;</FONT></P>
<P ><FONT face=宋体 size=3>printf(“\n\norigin->Dest Dist Path”);</FONT></P>
<P ><FONT face=宋体 size=3>printf(“\n-------------- ---- ----”);</FONT></P>
<P ><FONT face=宋体 size=3>chain=(int *)malloc(sizeof(int)*n);</FONT></P>
<P ><FONT face=宋体 size=3>for(i=0;i<n;i++)</FONT></P>
<P ><FONT face=宋体 size=3>for(j=0;j<n;j++)</FONT></P>
<P ><FONT face=宋体 size=3>if(i!=j)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>printf(“\n%6d->%4d”,i+1,j+1);</FONT></P>
<P ><FONT face=宋体 size=3>if(dist[j]==INT_MAX)</FONT></P>
<P ><FONT face=宋体 size=3>printf(“NA”);</FONT></P>
<P ><FONT face=宋体 size=3>else</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>printf(“%4d”,dist[j]);</FONT></P>
<P ><FONT face=宋体 size=3>count=0;</FONT></P>
<P ><FONT face=宋体 size=3>k=j;</FONT></P>
<P ><FONT face=宋体 size=3>do{ k=chain[count++]=path[k];}</FONT></P>
<P ><FONT face=宋体 size=3>while(i!=k);</FONT></P>
<P ><FONT face=宋体 size=3>reverse(chain,count);</FONT></P>
<P ><FONT face=宋体 size=3>printf(“%d”,chain[0]+1);</FONT></P>
<P ><FONT face=宋体 size=3>for(k=1;k<count;k++)</FONT></P>
<P ><FONT face=宋体 size=3>printf(“->%d”,chain[k]+1);</FONT></P>
<P ><FONT face=宋体 size=3>printf(“->%d”,j+1);</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>free(chain);</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>#define SWAP(a,b)</FONT></P>
<P ><FONT face=宋体 size=3>{temp=a;a=b;b=temp;}</FONT></P>
<P ><FONT face=宋体 size=3>void reverse(int x[],int n)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>int i,j,temp;</FONT></P>
<P ><FONT face=宋体 size=3>for(i=0,j=n-1;i<j;i++,j--)</FONT></P>
<P ><FONT face=宋体 size=3>SWAP(x,x[j]);</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>void readin(int dist[][MAXSIZE],int *number)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>int origin,dest,length,n;</FONT></P>
<P ><FONT face=宋体 size=3>int i,j;</FONT></P>
<P ><FONT face=宋体 size=3>char line[100];</FONT></P>
<P ><FONT face=宋体 size=3>gets(line);</FONT></P>
<P ><FONT face=宋体 size=3>sscanf(line,”%d”,&n);</FONT></P>
<P ><FONT face=宋体 size=3>*number=n;</FONT></P>
<P ><FONT face=宋体 size=3>for(i=0;i<n;i++)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>for(j=0;j<n;j++)</FONT></P>
<P ><FONT face=宋体 size=3>dist[j]=INT_MAX;</FONT></P>
<P ><FONT face=宋体 size=3>dist=0;</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>gets(line);</FONT></P>
<P ><FONT face=宋体 size=3>sscanf(line,”%d%d%d”,&origin,&dest,&length);</FONT></P>
<P ><FONT face=宋体 size=3>while(origin!=0&&dest!=0&&length!=0)</FONT></P>
<P ><FONT face=宋体 size=3>{</FONT></P>
<P ><FONT face=宋体 size=3>dist[origin-1][dest-1]=length;</FONT></P>
<P ><FONT face=宋体 size=3>gets(line);</FONT></P>
<P ><FONT face=宋体 size=3>sscanf(line,”%d%d%d”,&origin,&dest,&length);</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>
<P ><FONT face=宋体 size=3>}</FONT></P>}<BR><BR>谁能帮我写一个主函数,这是没加权的,不知道加权的怎么修改。<BR>谢谢哈 |