最短路径问题

来源:互联网 发布:旅游策划师 知乎 编辑:程序博客网 时间:2024/06/05 19:09

自己做了几道最短路的问题,其实Dijkstra算法我自己原来就知道思想,但是我自己明明知道思想却对吧这些思想写成代码无从下手!!!

我真的不知道该怎么去做

   第一: 我该用什么样的方式去存这个图呢?  从a到b有c的权值我到底该怎么去存这样的路?这样的表?我第一反应就是结构体  我用结构体存这个图。。嘻嘻

              但是很快我就发现了问题,用结构体存太麻烦。特别是我在访问的时候,加入是单向图的话还行,但是我刚刚做的题不是单向路径啊!,于是我想到用数组存这样的表,嗯,我们可以先存a,b,之后在存link[a][b]这样就好啦!然后我再做link[i][j]=link[j][i];这样的话马上就做了一个邻接矩阵了吧?嘻嘻,还有一点就是在初始化的时候要把link[i][i]这样的点初始化成0,这样的话我们访问的时候只要做一个一重循环就好了,对了,我在做题的时候还有一个问题就是a到b有多条路怎么办呢?    这个相当重要了,我们一般只需要存边最小的就可以了,所以我们在输入数据的时候就可以对这条边进行判断啦!满足条件再存起来就好啦。。嘻嘻

   第二:我该怎么去找到这个点第一次连接到其他点的距离呢?,开始我用结构体存的时候就想到这个问题,那样的话我们得访问结构体的a和b岂不是太浪费时间了?所以我们用二维数组的话就可以分号的解决这个问题了哦!

   第三:当我找到了这个最近的点我该怎么去做这个松弛操作呢?  横简单啦,想想就感觉简单,可是就怪我当时我想不出来,5555555

明天我要给桂茹讲这个算法,期待我能讲好一点,让桂茹听懂哈!!

 

下面我给一个简单的代码给大家看看该怎样操作

题目传送门”:http://acm.hdu.edu.cn/showproblem.php?pid=1874

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int link[1000][1000];int dis[201];#define INF 100000int main(void){    int n,m,a,b,i,j,sh,t;    int begin,end,Min;    int vis[200];    while(scanf("%d %d",&n,&m)!=EOF){        for(i=0;i<1000;i++){            for(j=0;j<1000;j++){                if(i==j)                    link[i][j]=0;                else link[i][j]=INF;            }        }        memset(vis,0,sizeof(vis));        for(i=0;i<m;i++){            scanf("%d %d",&a,&b);            scanf("%d",&t);            if(t<link[a][b]){                link[a][b]=t;                link[b][a]=link[a][b];            }        }        scanf("%d %d",&begin,&end);        vis[begin]=1;        for(i=0;i<n;i++){                dis[i]=link[begin][i];        }        while(1){            sh=-1;            for(i=0;i<n;i++){                if(!vis[i]&&(sh==-1||dis[i]<dis[sh])) sh=i;            }            if(sh==-1) break;            vis[sh]=1;            for(i=0;i<n;i++){                dis[i]=min(dis[i],dis[sh]+link[sh][i]);            }        }        if(dis[end]!=INF)            printf("%d\n",dis[end]);        else printf("-1\n");    }}

 

 

0 0