acm之路---最短路(Floyd、Dijstra,BellmanFord)

,听人说,acm初期就是练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来. 这是第一个算法,最短路径,因为自己只学过c语言所以都是用c写得,三种算法具体介绍在上一篇。

Floyd最短路

#include<stdio.h>

#define inf 100

int c[5][5]={

1,-1,inf,2,3,

inf,2,1,-2,4,

2,inf,1,-1,5,

5,3,2,0,inf,

};

int n=5;

int floy(){

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

for(int k=0;k<n;k++)

if(c[i][j]>c[i][k]+c[k][j])

c[i][j]>c[i][k]+c[k][j];

return 0;}

int main(){

floy();

for(int i=0;i<n;i++){

for(int j=0;j<n;j++)

printf("%d",c[i][j]);

printf("\n");

}}

Dijkstra算法

#include<stdio.h>
void main()
{

int infinity=100,j,i,n,k,t;
printf("input the value of n:");
scanf("%d",&n);
int d[100];
int s[100];
int p[100];

int w[100][100] ;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d\n",&w[i][j]);


for(s[0]=1,i=1;i<n;i++)
{
s[i]=0;d[i]=w[0][i]; //d[i]==从v[0]到其他的v[i]的路径权值
if(d[i]<infinity) p[i]=0; //成立的话为0,不成立的话为-1
else p[i]=-1;
}

//关键下面的循环逐步扩充
//三个循环
for(i=1;i<n;i++)
{
t=infinity;k=1;

for(j=1;j<n;j++)
if((!s[j])&&(d[j]<t))
{t=d[j];k=j;} //k记录最小的

s[k]=1;//point k join the S

for (j=1;j<n;j++)
if((!s[j])&&(d[j]>d[k]+w[k][j]))
{d[j]=d[k]+w[k][j];p[j]=k;}

}
printf("从源点到其它顶点的最短距离依次如下:");
for(i=1;i<n;i++)
printf("%d\n", d[i]);

}

 

 

 

posted @ 2011-12-03 11:12  落尘祥  阅读(865)  评论(0编辑  收藏  举报