poj 3463(最短路和比最短路大1的路的数量)(dijkstra)

求最短路和比最短路大1的路的数量

dij松弛的条件改变下,有四种情况

1.比最短路短2.等于最短路3.长与最短路但短于次短路4.等于次短路

具体见代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <queue>
  6 #include <vector>
  7 using namespace std;
  8 const int inf = 0x3f3f3f3f;
  9 const int maxn = 1005;
 10 int n,m,S,F;
 11 struct edge
 12 {
 13     int v,c;
 14     edge(){}
 15     edge(int v, int c):v(v), c(c){}
 16 };
 17 vector <edge> adj[maxn];
 18 
 19 void init()
 20 {
 21     int u,v,c;
 22     scanf("%d%d", &n, &m);
 23     memset(adj, 0, sizeof(adj));
 24     for (int i = 0; i < m; ++i)
 25     {
 26         scanf("%d%d%d", &u, &v, &c);
 27         adj[u].push_back(edge(v,c));
 28     }
 29     scanf("%d%d", &S, &F);
 30 }
 31 
 32 int dij(int src)
 33 {
 34     bool vis[maxn][2];
 35     int dis[maxn][2],cnt[maxn][2];
 36     int v,c;
 37     for (int i = 0; i <= n; ++i)
 38     {
 39         vis[i][0] = vis[i][1] = 0;
 40         dis[i][0] = dis[i][1] = inf;
 41         cnt[i][0] = cnt[i][1] = 0;
 42     }
 43     dis[src][0] = 0;cnt[src][0] = 1;
 44     /*for (int i = 0; i < adj[src].size(); ++i)
 45     {
 46         v = adj[src][i].v;
 47         c = adj[src][i].c;
 48         dis[v][0] = c;
 49         cnt[v][0] = 1;
 50     }
 51     vis[src][0] = 1;*/
 52     for (int i = 1; i < n * 2; ++i)
 53     {
 54         int tmp = inf, k = src, kind=0;
 55         for (int j = 1; j <= n; ++j)
 56         {
 57             if (!vis[j][0] && tmp > dis[j][0])
 58             {
 59                 tmp = dis[j][0];
 60                 k = j;
 61                 kind = 0;
 62             }
 63             else if(!vis[j][1] && tmp > dis[j][1])
 64             {
 65                 tmp = dis[j][1];
 66                 k = j;
 67                 kind = 1;
 68             }
 69         }
 70         if(tmp == inf) break;
 71         vis[k][kind] = 1;
 72         for (int j = 0; j < adj[k].size(); ++j)
 73         {
 74             v = adj[k][j].v;
 75             c = adj[k][j].c;
 76             if (dis[v][0] > tmp + c)
 77             {
 78                 dis[v][1] = dis[v][0];
 79                 dis[v][0] = tmp +c;
 80                 cnt[v][1] = cnt[v][0];
 81                 cnt[v][0] = cnt[k][kind];
 82             }
 83             else if (tmp + c == dis[v][0])
 84                 cnt[v][0] += cnt[k][kind];
 85             else if (dis[v][1] > c + tmp)
 86             {
 87                 dis[v][1] = c + tmp;
 88                 cnt[v][1] = cnt[k][kind];
 89             }
 90             else if (dis[v][1] == tmp + c)
 91                 cnt[v][1] += cnt[k][kind];
 92         }
 93     }
 94     if (dis[F][0] + 1 == dis[F][1])
 95         return cnt[F][0] + cnt[F][1];
 96     else
 97         return cnt[F][0];
 98 }
 99 int main()
100 {
101     int t;
102     scanf("%d", &t);
103     while (t--)
104     {
105         init();
106         printf("%d\n",dij(S));
107     }
108     return 0;
109 }

 

转载于:https://www.cnblogs.com/Missa/archive/2012/08/31/2665244.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值