hdu 2544(Dijkstra)

来源:互联网 发布:淘宝店铺的公司介绍 编辑:程序博客网 时间:2024/04/29 07:35

题目链接:点击打开链接

题目分析:Dijkstra的简单应用,给出源点(1号节点)和目的地(n号节点),求出最短路径,自己结合教材YY的代码

题目小结:DIjkstra的无向图应用     

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define INF  0x3f3f3fusing namespace std;int grid[105][105],ans=0;void Dijkstra(int n){    int min_dis,i,dis[105],w,v,s;    bool intree[105];    ans=0;    for(i=1;i<=n;i++)    {        intree[i]=false;        if(grid[1][i]==-1) dis[i]=INF;//先处理初始和源点相连的结点,若没有直接相连则赋值INF        else dis[i]=grid[1][i];      //          }    v=1;dis[1]=0,intree[1]=true;//intree 记录是否加入了新集合    for( i=1; i<=n&&!intree[n];i++)//由于只求到n的最短路,所以其他可以省略    {        min_dis=INF;        for(w=1;w<=n;w++)           if(!intree[w])             if(dis[w]<min_dis){v=w; min_dis=dis[w];}        intree[v]=true;        for(w=1;w<=n;w++)//用于更新到源点的最近距离        {            if(!intree[w]&&(min_dis+grid[v][w]<dis[w])&&grid[v][w]!=-1)            {                dis[w] = min_dis + grid[v][w] ;            }        }    }    ans=dis[n];}int main(){    freopen("in.txt","r",stdin);   int n,m,i,a,b,c;   while(scanf("%d%d",&n,&m)&&(n||m))   {   memset(grid,-1,sizeof(grid));//表示ij 之间没有路径       for(i=1;i<=m;i++)       {           scanf("%d%d%d",&a,&b,&c);           grid[a][b]=grid[b][a]=c;       }       Dijkstra(n);       printf("%d\n",ans);   }   return 0;}


原创粉丝点击