hdu1874我的第一篇最短路

来源:互联网 发布:c 后台调用前台js 编辑:程序博客网 时间:2024/05/29 14:33

这是我写的第一篇最短路,开完例会后有一些小清楚,之后又看了看lrj大神的算法竞赛,照葫芦画瓢的写上了核心代码。虽然还不是很熟练,再找找水题aa试试。

这一题要注意几点:

一:写进map的是最短距离,要和length进行比较;

二:初学者要注意memset只能用-1,0;


#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>const int INF=1e9;using namespace std;int map[200][200];int vis[200];int dis[200];void dijkstra(int from,int to,int n){    memset(vis,0,sizeof(vis));    dis[from]=0;    vis[from]=1;    for (int i=0;i<n;i++){        dis[i]=map[from][i];    }    for(int i=0;i<n;i++){                //在未标记的节点中,求出d值最小的节点x        int x,m=INF;        for(int y=0;y<n;y++){            if(!vis[y]&&dis[y]<=m){                m=dis[x=y];                 }        }        vis[x]=1;        for(int y=0;y<n;y++){            dis[y]=min(dis[y],dis[x]+map[x][y]);    //(体现出最短路)        }    }}int main(){    //freopen("int.text","r",stdin);    int n,m;    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<n;i++)//注意不能使用memset(map,INF,sizeof(map));            for(int j=0;j<n;j++)                map[i][j]=INF;        for(int i=0;i<200;i++)map[i][i]=0;        int from,to,length;        while(m--){            scanf("%d%d%d",&from,&to,&length);            if(length<map[from][to]){               map[to][from]=map[from][to]=length;            }        }        scanf("%d%d",&from,&to);        dijkstra(from,to,n);        if(dis[to]==INF)cout<<-1<<endl;        else cout<<dis[to]<<endl;    }    return 0;}


0 0
原创粉丝点击