入门经典-最淳朴的dijkstra

来源:互联网 发布:最新mac装win10 编辑:程序博客网 时间:2024/05/01 23:38

之前有怀疑它的正确性

是因为把他想成了一棵树 求出来的不是最短的

然而学长讲了后 我懂了 他是每找到最近的一个点 就优化所有的点 最近的潜力一定是最高的


之前写的 把 边 00 11.。。。写成了INT_MAX 出来的都是负数 后来发现 INT_MAX 加一个数会变成负数 看来以后不能随便用


#include <iostream>#include <cstdio>#include <cstring>#include <climits>#define MAX 5using namespace std;int d[100],edge[100][100];bool visi[100];int main(){    //0为起点    for(int i=1;i<=MAX;++i) d[i]=(i==0?0:INT_MAX);    for(int i=0;i<=MAX;++i)        for(int j=0;j<=MAX;++j)            if(i!=j)            {                scanf("%d",&edge[i][j]);            }    for(int i=0;i<=MAX;++i)        edge[i][i]=(1<<20);    memset(visi,0,sizeof(visi));    for(int i=0;i<=MAX;++i)    {        int x,u=INT_MAX;        for(int j=0;j<=MAX;++j) if(!visi[j]&&d[j]<=u) u=d[x=j];        visi[x]=true;        for(int k=0;k<=MAX;++k) d[k]=min(d[k],d[x]+edge[x][k]);    }    cout<<d[3]<<endl;    for(int i=0;i<=MAX;++i)        cout<<d[i]<<" ";    return 0;}


0 0
原创粉丝点击