poj2387解题报告(Dijkstra算法)

来源:互联网 发布:mac强制卸载 编辑:程序博客网 时间:2024/06/05 20:11

题目大意:给你一个图,求最短路。

解题思路:dijkstra模板题直接上即可。

注意点:有重边,输入的时候判断下,以边权小为准

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;const int INF=(1<<30);const int maxn=1000+100;int Map[maxn][maxn],dis[maxn],path[maxn],m,n,vis[maxn];void init()//初始化图{    for(int i=0;i<=n;i++)        for(int j=0;j<=n;j++)            if(i!=j) Map[i][j]=INF;            else Map[i][j]=0;}void Dijkstra(int src){    int i,j,minn,pos;    memset(vis,0,sizeof(vis));    for(i = 1; i<=n; i++)        dis[i] = INF;    dis[src] = 0;    for(i = 1; i<=n; i++)    {        minn = INF;        pos = 0;        for(j = 1; j<=n; j++)//找每次的最小距离        {            if( !vis[j]&&minn>dis[j] )                {                        pos = j;minn= dis[j];                }        }        vis[pos] = 1;        for(j = 1; j<=n; j++)//松弛操作            if( !vis[j]&&dis[j]>dis[pos]+Map[pos][j])                dis[j] = dis[pos]+Map[pos][j];    }}int main(){        while(scanf("%d%d",&m,&n)!=EOF)        {                 init();                int u,v,w;                for(int i=1;i<=m;i++)                {                        scanf("%d%d%d",&u,&v,&w);                        if(w<Map[u][v]) Map[u][v]=Map[v][u]=w;                }                Dijkstra(1);                printf("%d\n",dis[n]);        }        return 0;}



0 0
原创粉丝点击