一。图论
1.DijStla
void dijstra(){
int i,j,ans=-1,min,v;
int d[MAXV],vis[MAXV];
//d数组表示从原点到i点的最短距离
//vis用于表达这个点是否已经被选中
for(i=1;i<=n;i++){
d[i]=INF;
vis[i]=0;
}
d[1]=0; //因为start到start的距离为0,这里源点为1
for(i=1;i<=n;i++){
min=INF;
for(j=1;j<=n;j++){ //每次找点的过程,首先这个点没有被发现,然后找一个最小点
if(!vis[j] && d[j]<min){
min=d[j];
v=j;
}
}
//这里为什么找的最小的边就一定是最短路呢
//因为一个图要连通起来,就必须有一条边和已知点集连起来,所以找的最小的未知点必是最短路
vis[v]=1;
for(j=1;j<=n;j++) //加进最小点后,再修改从源点没有被发现的点的最短路径
if(!vis[j] && d[v]+map[v][j]<d[j])
d[j]=d[v]+map[v][j];
}
for(i=2;i<=n;i++)
if(d[i]>ans) ans=d[i];
printf("%d\n",ans);
}
http://blog.csdn.net/challenchenzhipeng/article/details/8100454
2. bellman-ford
typedef struct{
int a,b,w;
}Edge;
Edge edge[MAXM];
int n,m;
void bellman_ford(){
int i,j;
int d[MAXV];
for(i=2;i<=n;i++) d[i]=inf;
d[1]=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(d[edge[j].a]>edge[j].w+d[edge[j].b]) d[edge[j].a]=edge[j].w+d[edge[j].b];
if(d[edge[j].b]>edge[j].w+d[edge[j].a]) d[edge[j].b]=edge[j].w+d[edge[j].a];
}
}
printf("%d\n",d[n]);
}
http://blog.csdn.net/wangjian8006/article/details/7871889
3. floyd
void floyd(){
int i,j,k;
for(k=1;k<n;k++)
for(i=1;i<n;i++)
for(j=1;j<n;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
4. prim
void Prim(MGraph g,int v,int ∑)
/*
*LowCost[i]:当前生成树(U集合)到顶点i的多条边中最短的一条边。
*VexSet[i]:顶点i不在生成树中。1表示在里面,0反之。
*MGraph用的邻接矩阵表示,其中用edges[i][j]来记录i-->j是否有关系。n表示顶点个数,e表示边的个数。
*/
void Prim(MGraph g,int v,int ∑)
{
int LowCost[Max],VexSet[Max],v;
int i,j,k,min;
//初始化LowCost,VexSet数组
for(i=0;i<g.n;i++)
{
LowCost[i]=g.edges[v][i];
VexSet[i]=0;
}
VexSet[v]=1;
sum=0;
/*------------------------------------------------我是分割线---------------------------------------------------------*/
for(i=0;i<g.n;i++)
{
min = INF;//表示无穷或者大于所有的权值就行
//找出LowCost的最短代价(权值)即找出最短边中的最短的一条。
for(j=0;j<g.n;j++)
{
if(VexSet[j]==0&&LowCost[j]<min)
{
min = LowCost[j];
k=j;
}
}
//将该条边加入生成树中
VexSet[k]=1;
v=k;
sum+=min;//这个可以根据需要调整,这里做的是计算min的和。
//加入一个顶点v之后,生成树到各个不在生成树的顶点的最小值也会变。
//即更新LowCost数组(只计算不在生成树的顶点且只要更新与新添进去的顶点相关的边)。
for(j=0;j<g.n;j++)
{
if(VexSet[j]==0&&g.edges[v][j]<LowCost[j])
{
LowCost[j]=g.edges[v][j];
}
}
}
}