Dijkstra POJ

来源:互联网 发布:android网络访问404 编辑:程序博客网 时间:2024/05/19 13:19
/*题意就是说从节点为1走到节点为n的节点花的时间最短;这个题很明显就是最短路的一些知识了,用dijkstra水水的就过去了;然后呢就这个题目来说一下关于我对dijkstra的看法;这个东西呢就是计算单源最短路(从某个点到某一个点的最短时间);这个我们先将源头节点视为0(开始走的时间为0),其余的为inf(无穷);在n次循环中,我们在每一个未标记的节点中,选出达到这个点所花的最小时间的位置,再给予该位置进行标记,再从该位置出发更新它所有边的时间;这里有一个松弛操作,说白了就是将时间复杂度降低一点,但是个人感觉为没什么卵用;这个松弛操作以后继续说吧*/#include<cstdio>#include<cstring>using namespace std;const int inf=1<<29;const int maxn=1e3+7;int mmp[maxn][maxn];///地图兼权值记录;bool vis[maxn];int lowcost[maxn];///表示到达某个节点的最短开销;void dijkstra(int n){    for(int i=1;i<=n;i++)///进行初始化一下;    {        lowcost[i]=inf;        vis[i]=false;    }    lowcost[1]=0;///从1开始走嘛;记录当前节点所花时间为0;    for(int j=1;j<=n;j++)    {        int k=-1,Min=inf;        for(int i=1;i<=n;i++)            if(!vis[i]&&lowcost[i]<Min)            {                Min=lowcost[i];                k=i;            }            ///找到未标记的时间最短的节点。            if(k==-1) break;///未找到就直接break;            vis[k]=true;            for(int i=1;i<=n;i++)///从该节点引申到与它相邻的所有节点(相邻边,不断更新最小值);            if(!vis[i]&&lowcost[k]+mmp[k][i]<lowcost[i])                lowcost[i]=lowcost[k]+mmp[k][i];    }    return ;}int main (){    int n,t;    scanf("%d %d",&t,&n);    int x,y,w;    memset(mmp,0,sizeof(mmp));    memset(vis,0,sizeof(vis));    memset(lowcost,0,sizeof(lowcost));    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        mmp[i][j]=inf;    for(int i=1;i<=t;i++)    {        scanf("%d %d %d",&x,&y,&w);        if(w<mmp[x][y])///可能有重边的出现,咋们得取最小的进行计算,所以我们将mmp[][]存在于无向图的节点权值为无穷        {            mmp[x][y]=w;            mmp[y][x]=mmp[x][y];        }    }    dijkstra(n);    printf("%d\n",lowcost[n]);    return 0;}
原创粉丝点击