zoukankan      html  css  js  c++  java
  • hdoj 1874 畅通project续【SPFA】

    畅通project续

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 62   Accepted Submission(s) : 48
    Problem Description
    某省自从实行了非常多年的畅通project计划后,最终修建了非常多路。只是路多了也不好,每次要从一个城镇到还有一个城镇时。都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多。

    这让行人非常困扰。

    如今,已知起点和终点,请你计算出要从起点到终点。最短须要行走多少距离。

     

    Input
    本题目包括多组数据,请处理到文件结束。

    每组数据第一行包括两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。

    城镇分别以0~N-1编号。 接下来是M行道路信息。

    每一行有三个整数A,B,X(0<="A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。" 再接下一行有两个整数S,T(0<="S,T<N)。分别代表起点和终点。

     

    Output
    对于每组数据,请在一行里输出最短须要行走的距离。假设不存在从S到T的路线,就输出-1.
     

    Sample Input
    3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
     

    Sample Output
    2 -1
     

    Author
    linle
     

    Source
    2008浙大研究生复试热身赛(2)——全真模拟
    代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #define INF 0x3f3f3f3f
    using namespace std;
    int n,m;
    int s,e;
    int dis[210],vis[210];
    struct Edge
    {
     int from,to,val,next;
    }edge[2100];
    int head[2100],edgenum;
    void add(int u,int v,int w)
    {
     Edge E={u,v,w,head[u]};
     edge[edgenum]=E;
     head[u]=edgenum++;
    }
    void SPFA(int x)
    {
     queue<int>q;
     memset(vis,0,sizeof(vis));
     memset(dis,INF,sizeof(dis));
     q.push(x);
     dis[x]=0;
     vis[x]=1;
     while(!q.empty())
     {
      int u=q.front();
      q.pop();
      vis[u]=0;
      for(int i=head[u];i!=-1;i=edge[i].next)
      {
       int v=edge[i].to;
       if(dis[v]>dis[u]+edge[i].val)
       {
        dis[v]=dis[u]+edge[i].val;
        if(!vis[v])
        {
         vis[v]=1;
         q.push(v);
        }
       }
      }
     }
     if(dis[e]==INF)
      printf("-1 ");
     else
      printf("%d ",dis[e]);
    }
    int main(){
     while(scanf("%d%d",&n,&m)!=EOF)
     {
      int a,b,c;
      edgenum=0;
      memset(head,-1,sizeof(head));
      while(m--)
      {
       scanf("%d%d%d",&a,&b,&c);
       add(a,b,c);
       add(b,a,c);
      }
      scanf("%d%d",&s,&e);
      SPFA(s);

     }
     return 0;
    }

  • 相关阅读:
    理解和学习qml
    (离线)英语词典软件推荐
    Ubuntu:安装deb文件包以及deb卸载
    mac man汉化方法
    Linux中文件和目录的权限(r, w, x)
    解决mac休眠掉电的解决方法
    线程池之ThreadPool与ForkJoinPool
    程序员的知识焦虑
    回顾2018,展望2019
    NIO基础学习——缓冲区
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7372184.html
Copyright © 2011-2022 走看看