zoukankan      html  css  js  c++  java
  • 【uva10917】Walk Through the Forest (最短路)

    题目:

      gbn最近打算穿过一个森林,但是他比较傲娇,于是他决定只走一些特殊的道路,他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短。你的任务是计算一共有多少条不同的回家路径。其中起点的编号为1,终点的编号为2.

    分析:

      先求出每个点到终点的距离,根据题目要求找d[u]>d[v]的路径(u,v)走,计算路径数即可。

    代码如下:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 using namespace std;
     8 #define Maxn 1010
     9 
    10 struct node
    11 {
    12     int x,y,c,next;
    13 }t[2*Maxn*Maxn];int len;
    14 
    15 int n,m;
    16 int first[Maxn],dis[Maxn],f[Maxn];
    17 bool inq[Maxn];
    18 
    19 void ins(int x,int y,int c)
    20 {
    21     t[++len].x=x;t[len].y=y;t[len].c=c;
    22     t[len].next=first[x];first[x]=len;
    23 }
    24 
    25 void spfa(int s)
    26 {
    27     queue<int >     q;
    28     while(!q.empty()) q.pop();
    29     q.push(s);
    30     memset(dis,63,sizeof(dis));
    31     memset(inq,0,sizeof(inq));
    32     dis[s]=0;
    33     while(!q.empty())
    34     {
    35         int x=q.front();q.pop();
    36         for(int i=first[x];i;i=t[i].next)
    37         {
    38             int y=t[i].y;
    39             if(dis[y]>dis[x]+t[i].c)
    40             {
    41                 dis[y]=dis[x]+t[i].c;
    42                 if(!inq[y]) {inq[y]=1;q.push(y);}
    43             }
    44         }
    45         inq[x]=0;
    46     }
    47 }
    48 
    49 int ffind(int x)
    50 {
    51     if(f[x]!=-1) return f[x];
    52     f[x]=0;
    53     for(int i=first[x];i;i=t[i].next) if(dis[x]>dis[t[i].y])
    54     {
    55         f[x]+=ffind(t[i].y);
    56     }
    57     return f[x];
    58 }
    59 
    60 int main()
    61 {
    62     while(1)
    63     {
    64         scanf("%d",&n);
    65         if(n==0) break;
    66         scanf("%d",&m);
    67         len=0;
    68         memset(first,0,sizeof(first));
    69         for(int i=1;i<=m;i++)
    70         {
    71             int x,y,c;
    72             scanf("%d%d%d",&x,&y,&c);
    73             ins(x,y,c);ins(y,x,c);
    74         }
    75          spfa(2);
    76          memset(f,-1,sizeof(f));
    77          f[2]=1;
    78          ffind(1);
    79          printf("%d
    ",f[1]);
    80     }
    81     return 0;
    82 }
    uva 10917

    2016-03-21 13:49:15

  • 相关阅读:
    动态显示隐藏的kindeditor 编辑器,如何获取焦点
    BT修改默认端口
    fa内容重复度检测
    fa后台总是提示 未知的数据格式,以及调试方法大全
    vscode这种界面是怎么回事?我丢你楼某
    腾讯云服务器,安装BT面板
    fastadmin编辑器配置,类比wangeditor
    fastadmin 安装过插件以后,原始插件的文件能不能删除?
    leetcode——65. 有效数字
    leetcode——8. 字符串转换整数 (atoi)
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/5301643.html
Copyright © 2011-2022 走看看