最短路复习

来源:互联网 发布:软件代工 电影 编辑:程序博客网 时间:2024/05/18 18:20

//贝尔曼福特
#include<stdio.h>
#include<string.h>
#define maxnum 2000
#define maxint 999999
struct node
{
    int u,v,w;
} edge[maxnum];
int dis[maxint];
int dian,bian,a;
void init()
{
    int i;
    scanf("%d %d %d",&dian,&bian,&a);
    memset(dis,maxint,sizeof(dis));
    dis[a]=0;
    for(i=1; i<=bian; i++)
    {
        scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);
        if(dis[edge[i].u]==a)
            dis[edge[i].v]=edge[i].w;
    }
}
int  BF()
{
    int i,j,flag=1,mark;
    for(i=1; i<=dian-1; i++)
    {
        mark=0;
        for(j=1; j<=bian; j++)
        {
            if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
            {
                dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
                mark=1;
            }
        }
    }
    for(j=1; j<=bian; j++)
    {
        if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
        {
            flag=0;
            break;
        }


    }
    return flag;
}
int main()
{
    int i;
    init();
    if(BF())
    {
        for( i=1; i<=dian; i++)     //全部输出
            printf("%d\n",dis[i]);
    }
    else
        printf("-1\n");
    return 0;
}






//求最短路径
/*
#include<stdio.h>
#include<string.h>
#define maxnum 200000
#define maxint 1000000
struct node
{
    int s,v,w,f;
} edge[1000000];
int dian,bian,st,fn;
int count;
void BFS()
{
    int dis[maxnum];
    int vis[maxnum];
    int i,j;
    int a,b;
     for (i = 0;i <= dian;i++)
        dis[i] = maxint;
    for (i = 0;i <= dian;i++)
        vis[i] = maxint;
    dis[st]=0;
    vis[st]=0;
    for(i=1; i<=dian; i++)
    {
        for(j=0; j<count; j++)
        {
            a=edge[j].s;
            b=edge[j].v;
            if(dis[b]>dis[a]+edge[j].w)
            {
                dis[b]=dis[a]+edge[j].w;
                vis[b]=vis[a]+edge[j].f;
            }
            else if(dis[b]==dis[a]+edge[j].w)
            {
                vis[b]=vis[b]<vis[a]+edge[j].f? vis[b]:vis[a]+edge[j].f;
            }
        }
    }
    printf("%d %d\n",dis[fn],vis[fn]);
}
int main()
{
    int i,s,v,w,f;
    while(scanf("%d %d",&dian,&bian),dian||bian)
    {
        count=0;
        for(i=0; i<bian; i++)
        {
            scanf("%d %d %d %d",&s,&v,&w,&f);
            edge[count].s=s;
            edge[count].v=v;
            edge[count].w=w;
            edge[count].f=f;
            count++;
            edge[count].s=v;
            edge[count].v=s;
            edge[count].w=w;
            edge[count].f=f;
            count++;
        }
        scanf("%d %d",&st,&fn);
        BFS();
    }
    return 0;
}
*/






/*
#include<iostream>
#include<cstdio>
using namespace std;


#define MAX 0x3f3f3f3f
#define N 1010
int nodenum, edgenum, original; //点,边,起点


typedef struct Edge //边
{
int u, v;
int cost;
}Edge;


Edge edge[N];
int dis[N], pre[N];


bool Bellman_Ford()
{
for(int i = 1; i <= nodenum; ++i) //初始化
dis[i] = (i == original ? 0 : MAX);
for(int i = 1; i <= nodenum - 1; ++i)
for(int j = 1; j <= edgenum; ++j)
if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost) //松弛(顺序一定不能反~)
{
dis[edge[j].v] = dis[edge[j].u] + edge[j].cost;
pre[edge[j].v] = edge[j].u;
}
bool flag = 1; //判断是否含有负权回路
for(int i = 1; i <= edgenum; ++i)
if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost)
{
flag = 0;
break;
}
return flag;
}


void print_path(int root) //打印最短路的路径(反向)
{
while(root != pre[root]) //前驱
{
printf("%d-->", root);
root = pre[root];
}
if(root == pre[root])
printf("%d\n", root);
}


int main()
{
scanf("%d%d%d", &nodenum, &edgenum, &original);
pre[original] = original;
for(int i = 1; i <= edgenum; ++i)
{
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].cost);
}
if(Bellman_Ford())
for(int i = 1; i <= nodenum; ++i) //每个点最短路
{
printf("%d\n", dis[i]);
printf("Path:");
print_path(i);
}
else
printf("have negative circle\n");
return 0;
}*/
//弗洛伊德
/*#include<stdio.h>
#include<string.h>
int N=100000000;
int main()
{
    int n,m,a[101][101],x,y,i,j,k,t;
    while(scanf("%d%d",&n,&m),n||m)
        {
       for(i=0;i<=n;i++)
        for(j=0;j<=n;j++)
        a[i][j]=N;
       for(i=0;i<=n;i++)
        a[i][i]=0;
        for(i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&t);
       if(a[x][y]>t)
            {a[x][y]=t;
            a[y][x]=t;}
        }
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                    if(a[j][k]>a[j][i]+a[i][k])
                        a[j][k]=a[j][i]+a[i][k];
        printf("%d\n",a[1][n]);
    }
    return 0;
}*/
//Dijkstra
/*#include<stdio.h>
#include<string.h>
#define maxnum 200
#define maxint 999999
int dis[maxnum];
int pre[maxnum];
int map[maxnum][maxnum];
int v[maxnum];
int n,m;
void dij(int n,int v)
{
    int i,pos,j,max;
    int s[maxnum]={0};
    for(i=1;i<=n;i++)
        {
            dis[i]=map[v][i];
            s[i]=0;
            if(dis[i]==maxint)
                pre[i]=0;
            else
                pre[i]=v;
        }
        dis[v]=0;
        s[v]=1;
     for(i=2;i<=n;i++)
     {
         max=maxint;
         pos=v;
         for(j=1;j<=n;j++)
         {
             if(!s[j]&&dis[j]<max)
             {
                 max=dis[j];
                 pos=j;
             }
         }
         s[pos]=1;
         for(j=1;j<=n;j++)
         {
             if(!s[j]&&dis[j]>dis[pos]+map[pos][j]&&map[pos][j]<maxint)
             {
                 dis[j]=dis[pos]+map[pos][j];
                 pre[j]=pos;
             }
         }
     }


}
void zhaolujing(int v,int n)
{
   int shuchu[maxnum];
   int i=1,j;
   int tmp;
    shuchu[i]=n;
    i++;
    tmp=pre[n];
    while(tmp!=v)
    {
        shuchu[i++]=tmp;
        tmp=pre[tmp];
    }
    shuchu[i]=v;
    for( j=i;j>=1;j--)
        if(j!=1)
        printf("%d->",shuchu[j]);
    else
        printf("%d\n",shuchu[j]);
}
int main()
{
    int i,j;
    int p,q,len;
    scanf("%d %d",&n,&m);
    memset(map,maxint,sizeof(map));
    memset(v,0,sizeof(v));
    for(i=1; i<=m; i++)
        dis[i]=maxint;
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&p,&q,&len);
        if(map[i][j]>len)
        {
            map[p][q]=len;
            map[p][q]=len;
        }
    }
    dij(n,1);
    printf("从1点到终点的最短路径为%d\n",dis[n]);
    zhaolujing(1,n);
    return 0;
}*/


0 0
原创粉丝点击