最短路和次短路问题,dijkstra算法

  1 /* 
  2  *题目大意: 
  3  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 
  4  * 
  5  *算法思想: 
  6  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; 
  7  *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短路和次短路; 
  8  *再用一个cnt二维数组分别记录最短路和次短路的条数; 
  9  *每次更新路径的条数时,不能直接加1,,应该加上cnt[u][k],k为次短路径或者最短路径的标记; 
 10  *图有重边,不能用邻接矩阵存储; 
 11  *不知道为什么,题目上说的是N and M, separated by a single space, with 2≤N≤1000 and 1 ≤ M ≤ 10000; 
 12  *而我的代码硬是把N开成1W了才过,求解释,RE了无数次,擦; 
 13 **/ 
 14 #include<iostream>  
 15 #include<cstdio>  
 16 #include<cstring>  
 17 #include<string>  
 18 #include<algorithm>  
 19 using namespace std;  
 20    
 21 const int N=11111 22 const int M=111111 23 const int INF=0xffffff 24    
 25 struct node  
 26  27     int to;  
 28     int w;  
 29     int next;  
 30 };  
 31    
 32 node edge[N];  
 33 int head[N];  
 34    
 35 int dist[N][2],cnt[N][2];  
 36 bool vis[N][2];  
 37 int n,m,s,t,edges;  
 38    
 39 void addedge(int u,int v,int w)  
 40  41     edge[edges].w=w;  
 42     edge[edges].to=v;  
 43     edge[edges].next=head[u];  
 44     head[u]=edges++ 45  46    
 47 int dijkstra()  
 48  49     int k;  
 50     for(int i=0; i<=n; i++ 51     {  
 52         dist[i][0]=dist[i][1]=INF;  
 53         vis[i][0]=vis[i][1]=0 54         cnt[i][0]=cnt[i][1]=0 55     }  
 56     cnt[s][0]=1,dist[s][0]=0 57    
 58     for(int i=1; i<=n*2; i++ 59     {  
 60         int u=-1 61         int min_dist=INF;  
 62         for(int j=1; j<=n; j++ 63             for(int flag=0; flag<2; flag++ 64                 if(!vis[j][flag]&&dist[j][flag]<min_dist)  
 65                 {  
 66                     min_dist=dist[j][flag];  
 67                     u=j;  
 68                     k=flag;  
 69                 }  
 70         if(u==-1 71             break 72         vis[u][k]=true 73         for(int e=head[u]; e!=-1; e=edge[e].next)  
 74         {  
 75             int j=edge[e].to;  
 76             int tmp=dist[u][k]+edge[e].w;  
 77    
 78             if(tmp<dist[j][0])//tmp小于最短路径长:  
 79             {  
 80                 dist[j][1]=dist[j][0];//次短路径长  
 81                 cnt[j][1]=cnt[j][0];//次短路径计数  
 82                 dist[j][0]=tmp;//最短路径长  
 83                 cnt[j][0]=cnt[u][k];//最短路径计数  
 84             }  
 85    
 86             else if(tmp==dist[j][0])//tmp等于最短路径长:  
 87             {  
 88                 cnt[j][0]+=cnt[u][k];//最短路径计数  
 89             }  
 90    
 91             else if(tmp<dist[j][1])//tmp大于最短路径长且小于次短路径长:  
 92             {  
 93                 dist[j][1]=tmp;//次短路径长  
 94                 cnt[j][1]=cnt[u][k];//次短路径计数  
 95             }  
 96    
 97             else if(tmp==dist[j][1])//tmp等于次短路径长:  
 98             {  
 99                 cnt[j][1]+=cnt[u][k];//次短路径计数  
100             }  
101         }  
102     }  
103    
104     int res=cnt[t][0];  
105     if(dist[t][0]+1==dist[t][1])//判断最短路和次短路是否相差1  
106         res+=cnt[t][1];  
107     return res;  
108 109    
110 int main()  
111 112     //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);  
113     int tcase;  
114     scanf("%d",&tcase);  
115     while(tcase--116     {  
117         edges=0118         scanf("%d%d",&n,&m);  
119         memset(head,-1,sizeof(head));  
120         int u,v,w;  
121         for(int i=0; i<m; i++122         {  
123             scanf("%d%d%d",&u,&v,&w);  
124             addedge(u,v,w);  
125         }  
126         scanf("%d%d",&s,&t);  
127         printf("%d\n",dijkstra());  
128     }  
129     return 0130

 

转载于:https://www.cnblogs.com/Hammer-cwz-77/p/7337212.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE 8 MVC:使用bean参数

在上一篇文章中&#xff0c;我们看到了如何在MVC Controller中访问query &#xff0c; path和form参数 。 这篇文章展示了如何使用BeanParam批注将多个参数映射到一个对象。 让我们重用关于表单参数的文章中的简单HTML表单&#xff1a; <form action"submit" me…

用python验证猜想之类的例子_python练手好例子:验证哥德巴赫猜想

哥德巴赫猜想是一个谜&#xff0c;但十分适合用来作为编程练习涉及的几个问题&#xff1a;1、如何验证一个数是素数 def prime(n)一个整数n不能被2 到 n \sqrt{n}n​整除&#xff0c;则为素数2、产生N以内的素数列表本文中N取100&#xff0c;可以取更大3、对于大于6的偶数&…

oracle安装及卸载总结

>>>>> oracle安装&#xff08;卸载&#xff09;教程&#xff08;来自网络&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1eSzSwZC 密码: g3qn oracle_win_64安装包&#xff08;官网下的&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1nvBPzkt…

mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

MySQL数据库重命名的方法Innodb引擎的表如何改数据库名&#xff0c;MyISAM引擎又该如何操作。如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以。 Innodb完全不行&#xff0c;会提示相关表不存在。第一种方法&#xff1a;rename database 弃用了RENAME database …

mysql 中 and和or 一起使用和之间的优先级

SELECT address,job_title,education,SUM(recruiting) FROM commerce_jobs WHERE education 大专 and ( job_title LIKE %主管% OR job_title LIKE %组长% OR job_title LIKE %主任% OR job_title LIKE %项目经理% ) 标红部分的() 括号。and 比 or具有更高的优先级&#xff0c…

threadlocal_了解ThreadLocal背后的概念

threadlocal介绍 我知道本地线程&#xff0c;但直到最近才真正使用过它。 因此&#xff0c;我开始深入研究该主题&#xff0c;因为我需要一种传播某些用户信息的简便方法 通过Web应用程序的不同层&#xff0c;而无需更改每个调用方法的签名。 小前提信息 线程是具有自己的调…

mysql有nvarchar类型_mysql如何处理varchar与nvarchar类型中的特殊字符

如果你每次建数据表的时候固执的使用varchar&#xff0c;那么你可能会遇到以下的问题&#xff1a; 现在saleUserName的字段类型为varchar(50) update TableNameset saleUserName小覃祝你快乐 where ID87 select * from TableName where ID87 whySaleUserName字段里的文字怎么如…

linux 文件的压缩和打包

在我们的生活中&#xff0c;经常会和朋友、同事、客户发一些文件。为了能够更加快速、高效的将文件传递出去&#xff0c;经常会用到压缩工具。压缩工具通过一定的算法&#xff0c;把数据给尽可能的缩小。这样不仅方便传递、而且可以节省空间。有时候我们需要把一些零散的文件集…

python 爬取svg数据_抓取SVG图表

我试图从以下链接中获取以下svg&#xff1a;我要刮的部分如下&#xff1a;我不需要图表中的文字(只需要图表本身)。但是&#xff0c;我以前从来没有抓取过svg图像&#xff0c;我不确定这是否可能。我环顾四周&#xff0c;但找不到任何有用的python包来直接执行此操作。在我知道…

protected default

protected:主要作用 保护子类 子类可以继承和使用它的成员 其他不行 default:针对本包 类内部本包子类外部包publicOKOKOKOKprotectedOKOKOK defaultOKOK private OK 转载于:https://www.cnblogs.com/love-yangerlei/p/7352337.html

Java 8:再见手册SQL,您好!

大多数用Java编写的应用程序都需要某种形式的数据存储。 在小型应用程序中&#xff0c;这通常是通过使用普通SQL查询的原始JDBC连接来实现的。 另一方面&#xff0c;较大的系统通常使用对象关系映射&#xff08;ORM&#xff09;框架来处理数据库通信。 这两种方法都有优点和缺点…

java 鼠标拖动矩形_java – 用鼠标拖动创建矩形,而不是绘制

nb-首先要注意的是,这是使用Java 7完成的,在Java 6中创建透明窗口的方式不同,在更新10之下是不可能的(我相信)基本上,这会创建一个透明窗口,其大小和位置可以覆盖整个虚拟屏幕(也就是说,如果您有多个屏幕,它将覆盖所有虚拟屏幕).然后我使用JPanel作为主要容器来捕获鼠标事件并执…

java实现123n_java三线程交替打印123……n

使用多线程交替打印1--n&#xff0c;a进程打印1,4,7,……(3n1),b进程打印2,7,10,……(3n2),c进程打印3,6,9,……(3n)涉及到多线程的同步&#xff0c;阻塞&#xff0c;wait,notify代码如下Num.javapublic class Num {private int num 0;public Num(int num) {this.num num;}pu…

8月12

MTBF两次故障的时间&#xff0c;时间越长越好。 MTTR两次系统恢复的时间&#xff0c;越短越好 修改完参数后若出现报205的错误&#xff0c;检查路径 控制文件 SQL> show parameter control_files SQL> select * from v$controlfile; 修改路径&#xff1a; $ cd $ORACLE_H…

spring roo_使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry

spring rooSpring Roo是在Java平台上提供快速应用程序开发的工具。 我已经解释了何时使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持两种针对云计算的解决方案&#xff1a;Google App Engine&#xff08;GAE&a…

this指针 java_彻底理解Java中this指针

每次看到Java中的this指针&#xff0c;总摸不着头绪。在网上看了很多人的讲解&#xff0c;还是不知道this指针到底是什么东西&#xff0c;今天的的这篇日志可以让你看清this到底是谁。(内容摘自&#xff1a;http://www.mathcs.emory.edu/~cheung/Courses/170.2010/Syllabus/03/…

python中的浅拷贝和深拷贝

本篇介绍下python中的深拷贝和浅拷贝&#xff0c;主要从基本类型、类、不可变类型等方面进行介绍。 1.介绍拷贝之前首先应该明白is和的区别&#xff0c;即is表示同一个对象&#xff0c;比较的是值 >>> a 1000 >>> b 1000 >>> a b True >>&…

Spring开发人员知道的一件事

在最近关于&#xff08;核心&#xff09;Spring Framework的培训课程中&#xff0c;有人问我&#xff1a;“&#xff08;Java&#xff09;Spring开发人员是否应该知道一件事&#xff0c;那应该是什么&#xff1f;” 这个问题使我措手不及。 是的&#xff0c;&#xff08;核心&a…

mysql匿名事务gtid_MySQL GTID (二)

MySQL GTID 系列之二三.在线将GTID转化为传统模式环境见上篇系列文章关闭GTID,不用停止服务,不影响线上业务3.1 关闭GTID复制,调整为传统复制#SLVAE实例上停止复制STOP SLAVE#SLVAE实例上查看复制的位置SHOW SLAVE STATUS \G# 查看 Master_Log_File 和 Read_Master_Log_Pos对应…

JavaWeb(十七)——JSP中的九个内置对象

一、JSP运行原理 每个JSP 页面在第一次被访问时&#xff0c;WEB容器都会把请求交给JSP引擎&#xff08;即一个Java程序&#xff09;去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) &#xff0c;然后按照servlet的调用方式进行调用。  由于JSP第一次访问…