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]);
}