zoukankan      html  css  js  c++  java
  • poj 3463 次短路

    题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数。

    当年数据结构课程设计用A*做过,现在忘光了,2333

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<queue>
     5 #define VM 1005
     6 #define EM 10010
     7 using namespace std;
     8 const int inf=0x3f3f3f3f;
     9 int head[VM],cnt[VM][2],dist[VM][2],vis[VM][2];//dis[i][0]为最短路,dis[i][1]为次短路
    10 int e,src,des,n,m;
    11 struct E
    12 {
    13     int to,w,next;
    14 } edge[EM];
    15 void add(int cu,int cv,int cw)
    16 {
    17     edge[e].to=cv;
    18     edge[e].w=cw;
    19     edge[e].next=head[cu];
    20     head[cu]=e ++;
    21 }
    22 int dij()
    23 {
    24     int i,j,u,min,flag;
    25     memset(dist,0x3f,sizeof(dist));
    26     memset(vis,0,sizeof(vis));
    27     memset(cnt,0,sizeof(cnt));
    28     dist[src][0]=0;
    29     cnt[src][0]=1;
    30     for(i=1;i<2*n;i++)
    31     {
    32         min=inf;
    33         for(j=1;j<=n;j++)           //找新的最短路和次短路
    34             if(!vis[j][0]&&dist[j][0]<min)
    35             {
    36                 u=j;
    37                 flag=0;
    38                 min=dist[j][0];
    39             }
    40             else if(!vis[j][1]&&dist[j][1]<min)
    41             {
    42                 u=j;
    43                 flag=1;
    44                 min=dist[j][1];
    45             }
    46         if(min==inf)
    47             break;
    48         vis[u][flag]=1;
    49         for(j=head[u];j!=-1;j=edge[j].next)
    50         {
    51             int v=edge[j].to;
    52             int w=edge[j].w+min;
    53             if(dist[v][0]>w) //如果找到的新的值比最短路小,则更新最短路和次短路的值
    54             {
    55                 dist[v][1]=dist[v][0];//更新次短路
    56                 dist[v][0]=w;// 更新最短路
    57                 cnt[v][1]=cnt[v][0];
    58                 cnt[v][0]=cnt[u][flag];//更新最短路和次短路的个数
    59 
    60             }
    61             else if(dist[v][0]==w)   //如果值等于最短路
    62                 cnt[v][0]+=cnt[u][flag];//更新最短路的个数
    63             else if(dist[v][1]>w)    //如果找到的值小于次短路的值,更新次短路
    64             {
    65                 dist[v][1]=w;    //更新次短路的值
    66                 cnt[v][1]=cnt[u][flag];  //更新次短路的个数
    67             }
    68             else if(dist[v][1]==w)   //如果找到的值等于次短路的值
    69                 cnt[v][1]+=cnt[u][flag];//更新次短路的个数
    70         }
    71 
    72     }
    73     if(dist[des][0]+1==dist[des][1])//如果次短路的值等于最短路值+1
    74         cnt[des][0]+=cnt[des][1];
    75     return cnt[des][0];
    76 }
    77 int main()
    78 {
    79     int T,u,v,w;
    80     scanf("%d",&T);
    81     while(T--)
    82     {
    83         scanf("%d%d",&n,&m);
    84         memset(head,0xff,sizeof(head));
    85         e=0;
    86         while(m--)
    87         {
    88             scanf("%d%d%d",&u,&v,&w);
    89             add(u,v,w);
    90         }
    91         scanf("%d%d",&src,&des);
    92         int ans=dij();
    93         printf("%d
    ",ans);
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    并发通信、生产者消费者模型
    进程和线程的标识,守护模式
    IO多路复用
    网络编程(三):非阻塞套接字
    网络编程(二):套接字Socket
    网络编程(一):基础知识
    python标准库:base64模块
    @classmethod 和 @staticmethod
    Python特性及解释目录(不间断更新)
    Keras 整理及部分源码分析目录(不间断更新)
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4454167.html
Copyright © 2011-2022 走看看