zoj 2526(一道很好的最短路应用题)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1538

题意:最短路问题,但是要求出最短路的条数,同时要求出所有可能的最短路选择中javabean最多的情况。

思路:求到终点的最短路径用Dijkstra,其路径更新条件(如果到某个点有多个路径长度一样的最短路径,则选择豆子总数最多的)就是直接加个else if条件就搞定了,最后就是dfs搜一下最短路的条数了,这个我就记忆化了一下。

然后我一开始使用spfa写的,wa了好多次,orz...改成dijkstra就过了。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #include<vector>
  6 using namespace std;
  7 #define MAXN 555
  8 #define inf 1<<30
  9 /*
 10 struct Node{
 11     int v,w;
 12 };
 13 vector<Node>vet[MAXN];
 14 */
 15 int map[MAXN][MAXN];
 16 int path[MAXN];
 17 int dist[MAXN];
 18 int value[MAXN];
 19 int sum_value[MAXN];
 20 int dp[MAXN];
 21 int mark[MAXN];
 22 int n,m,st,ed;
 23 
 24 /*
 25 void SPFA(){
 26     memset(sum_value,0,sizeof(sum_value));
 27     memset(path,-1,sizeof(path));
 28     for(int i=0;i<n;i++)dist[i]=inf;
 29     dist[st]=0,sum_value[st]=value[st];
 30     queue<int>Q;
 31     Q.push(st);
 32     while(!Q.empty()){
 33         int u=Q.front();
 34         Q.pop();
 35         for(int i=0;i<vet[u].size();i++){
 36             int v=vet[u][i].v;
 37             int w=vet[u][i].w;
 38             if(dist[u]+w<=dist[v]){
 39                 path[v]=u;
 40                 Q.push(v);
 41                 if(dist[u]+w<dist[v]){
 42                     dist[v]=dist[u]+w;
 43                     sum_value[v]=sum_value[u]+value[v];
 44                 }else if(sum_value[v]<sum_value[u]+value[v]){
 45                     sum_value[v]=sum_value[u]+value[v];
 46                 }
 47             }
 48         }
 49     }
 50 }
 51 */
 52 
 53 void Dijkstra(){
 54     memset(mark,false,sizeof(mark));
 55     memset(sum_value,0,sizeof(sum_value));
 56     memset(path,-1,sizeof(path));
 57     for(int i=0;i<n;i++)dist[i]=map[st][i];
 58     dist[st]=0,sum_value[st]=value[st],mark[st]=true;
 59     int u=st;
 60     for(int i=0;i<n-1;i++){
 61         int min=inf;
 62         for(int j=0;j<n;j++){
 63             if(!mark[j]&&map[u][j]<inf&&dist[u]+map[u][j]<=dist[j]){
 64                 if(dist[u]+map[u][j]<dist[j]){
 65                     dist[j]=dist[u]+map[u][j];
 66                     sum_value[j]=sum_value[u]+value[j];
 67                     path[j]=u;
 68                 }else if(sum_value[j]<sum_value[u]+value[j]){
 69                     sum_value[j]=sum_value[u]+value[j];
 70                     path[j]=u;
 71                 }
 72             }
 73         }
 74         for(int j=0;j<n;j++){
 75             if(!mark[j]&&min>dist[j]){
 76                 min=dist[j],u=j;
 77             }
 78         }
 79         mark[u]=true;
 80     }
 81 }
 82     
 83 
 84 
 85 /*
 86 int dfs(int u){
 87     if(u==ed)return 1;
 88     if(dp[u])return dp[u];
 89     for(int i=0;i<vet[u].size();i++){
 90         int v=vet[u][i].v;
 91         int w=vet[u][i].w;
 92         if(dist[v]==dist[u]+w){
 93             dp[u]+=dfs(v);
 94         }
 95     }
 96     return dp[u];
 97 }
 98 */
 99 
100 int dfs(int u){
101     if(u==ed)return 1;
102     if(dp[u])return dp[u];
103     for(int i=0;i<n;i++)if(u!=i){
104         if(dist[i]==dist[u]+map[u][i]){
105             dp[u]+=dfs(i);
106         }
107     }
108     return dp[u];
109 }
110 
111 
112 void Print(int u){
113     if(path[u]==-1){
114         printf("%d",u);
115         return ;
116     }
117     Print(path[u]);
118     printf(" %d",u);
119 }
120 
121 int main(){
122     int u,v,w;
123     while(~scanf("%d%d%d%d",&n,&m,&st,&ed)){
124     //    for(int i=0;i<n;i++)vet[i].clear();
125         for(int i=0;i<n;i++){
126             map[i][i]=0;
127             for(int j=i+1;j<n;j++){
128                 map[i][j]=map[j][i]=inf;
129             }
130         }
131         for(int i=0;i<n;i++)
132             scanf("%d",&value[i]);
133         for(int i=1;i<=m;i++){
134             scanf("%d%d%d",&u,&v,&w);
135             /*
136             Node p1,p2;
137             p1.v=v,p2.v=u;
138             p1.w=p2.w=w;
139             vet[u].push_back(p1);
140             vet[v].push_back(p2);
141             */
142             map[u][v]=map[v][u]=w;
143         }
144     //    SPFA();
145         Dijkstra();
146         memset(dp,0,sizeof(dp));
147         int ans=dfs(st);
148         printf("%d %d\n",ans,sum_value[ed]);
149         Print(ed);
150         puts("");
151     }
152     return 0;
153 }
View Code

 

转载于:https://www.cnblogs.com/wally/archive/2013/05/14/3078757.html

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

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

相关文章

MySQL常用命令大全

登录MySQL方法 单实例MySQL登录的方法 mysql #刚装完系统无密码情况登录方式&#xff0c;不需要密码 mysql -u root #刚装完系统无密码的情况登录 mysql -uroot -p #这里标准的dba命令行登录 mysql -uroot -poldboy #非脚本里一般不这样用&#xff0c;密码明文会泄露密码…

iOS 利用UIDocumentInteractionController打开和预览文档

iOS提供了使用其他app预览文件的支持&#xff0c;这就是Document Interaction Controller。此外&#xff0c;iOS也支持文件关联&#xff0c;允许其他程序调用你的app打开某种文件。而且&#xff0c;从4.2开始&#xff0c;Quick Look Framework提供了对多种文档的内置打印。你可…

服务器安全之iptables iptables

服务器安全之iptables 感谢老男孩老师为我们讲解iptables 优化之路 iptables防火墙简介 Netfilter/Iptables&#xff08;以下简称Iptables&#xff09;是unix/linux自带的一款优秀且开放源代码的安全自由的**基于包过滤的防火墙工具**&#xff0c;它的功能十分强大&#xff0…

MC新手入门(三十)------ 逻辑运算符和表达式

游戏设计中提供了三种逻辑运算符&#xff1a; 1&#xff09;&& 与运算 2&#xff09;|| 或运算 3&#xff09; &#xff01;非运算 游戏设计中我们常常要用到上面的逻辑运算&#xff0c;例如&#xff1a;当在双人游戏中都要实现两人同时存活才能过关&#xff0c;…

Nagios 配置及监控

Nagios 监控 在互联网日益发展的今天&#xff0c;监控的重要性已经不言而喻。可能打开一个URL要经过6-7层的处理&#xff0c;如果出了问题而没有监控将很难定位到问题所在。那哪些内容需要监控呢&#xff1f; 1.本地资源 (1) 负载&#xff1a;uptime&#xff1b; (2) CPU&…

if ($this-getRequest()-isPost()) {

if ($this->getRequest()->isPost()) { // Make certain to merge the files info! $post array_merge_recursive( $this->getRequest()->getPost()->toArray(), $this->getRequest()->getFiles()->toArray() ); $form->setData($post);转载于:htt…

SSH 配置

SSH 批量管理 SSH介绍 SSH是Secure Shell Protocol的简写&#xff0c;由IETF网络工作小组&#xff08;Network working Group&#xff09;指定&#xff1b;在进行数据传输之前&#xff0c;SSH先对联机数据包通过加密技术进行加密处理&#xff0c;加密后在进行数据传输。确保了传…

50种方法巧妙优化你的SQLServer数据库(转)

查询速度慢的原因很多&#xff0c;常见如下几种&#xff1a;    1、没有索引或者没有用到索引(这是查询慢最常见的问题&#xff0c;是程序设计的缺陷)    2、I/O吞吐量小&#xff0c;形成了瓶颈效应。    3、没有创建计算列导致查询不优化。    4、内存不足  …

SaltStack 第一板块入门介绍 [1]

SaltStack简单说明 一个配置管理系统&#xff0c;能够维护预定义状态的远程节点(比如&#xff0c;确保指定的报被安装&#xff0c;指定的服务在运行) 一个分布式远程执行系统&#xff0c;用来在远程节点&#xff08;可以是单个节点&#xff0c;也可以是任意规则挑选出来的节点&…

android 捕捉home键

android4.0以下 可用 privatebooleancatchHomeKey false; public void onAttachedToWindow() { if (!catchHomeKey) { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } super.onAttachedToWindow(); } 然后再在 onKeyDown方法中捕…

SaltStack 第二板块安装说明 [2]

安装说明我们为了模拟环境开启两台服务器&#xff0c;本次以Centos7 为例主机名 IP地址 说明 linux-node1.example.com 192.168.56.11 模式&#xff1a;master linux-node2.example.com 192.168.56.12 模式&#xff1a;minion 官方已经提供了Yum&#xff0c;我们可以指…

文件设置Thrift实例

时间紧张&#xff0c;先记一笔&#xff0c;后续优化与完善。 要学习Thrift&#xff0c;它的官网上有资料分析以及实例&#xff0c;可以到官网&#xff1a;http://thrift.apache.org/上查看。 在官网下载thrift的资源包&#xff0c;安装编译生成响应语言下的jar包&#xff0c;详…

服务器重启导致无法启动MySQL

今天服务器受到DDOS攻击&#xff0c;笔者脑残重启了一下服务器。结果造成MySQL服务器无法启动mysql日志见下图。160803 17:43:47 mysqld_safe Starting mysqld daemon with databases from /application/mysql/data160803 17:43:47 [Note] /application/mysql/bin/mysqld (mysq…

Linux守护进程列表

在linux或者unix操作系统中在系统的引导的时候会开启很多服务&#xff0c;这些服务就叫做守护进程。为了增加灵活性&#xff0c;root可以选择系统开启的模式&#xff0c;这些模式叫做运行级别&#xff0c;每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台…

架构师之DNS实战

架构师 DNS实战 老男孩教育 DNS简介 1. DNS的出现及演化 网络出现的早起是使用IP地址通讯的&#xff0c;那是就几台主机通讯。但是随着接入网络主机的增多&#xff0c;这种数字标识的地址非常不便于记忆&#xff0c;UNIX上就出现了建立一个叫做hosts的文件&#xff08;Linux和W…

打包jar文件后的spring部署及hibernate自动建表经验总结

楔子 用springhibernate做一个服务器运行程序&#xff0c;在部署到服务器时&#xff08;打包成jar&#xff0c;在window server2008下运行&#xff09;&#xff0c;出现了以下两个纠结问题&#xff1a; 1. 加载不了Spring容器 2. hibernate.hbm2ddl.auto 到了服务器不能自动建表…

c语言非线程安全函数引发的BUG一列

公司的机器最近遇到一个bug(其实这个bug一年前就出现过,只是未引起重视),现象是这样的:在生产环境中,用户连续打印票的时候,中间某张票的一个时间可能会出问题,该时间本来是一个未来的时间,却被打印成了系统当前的时间.其他同事认为是传入的参数出错了,加了大量的调试信息和日志…

我是一个线程 [转]

我是一个线程&#xff0c;我一出生就被编了个号&#xff1a;0x3704&#xff0c;然后被领到一个昏暗的屋子里&#xff0c;在这里我发现了很多和我一模一样的同伴。 我身边的同伴0x6900 待的时间比较长&#xff0c;他带着沧桑的口气对我说&#xff1a;“我们线程的宿命就是处理包…

自动化运维之–Cobbler

Cobbler 自动化 Cobbler简介 Cobbler是一个快速网络安装linux的服务&#xff0c;而且在经过调整也可以支持网络安装windows。该工具使用python开发&#xff0c;小巧轻便&#xff08;才15k行python代码&#xff09;&#xff0c;使用简单的命令即可完成PXE网络安装环境的配置&…

基于VC++6.0的DLL开发

原文地址&#xff1a;http://blog.163.com/twnhr126/blog/static/78927547200910254346804/ 基于VC6.0的DLL开发 最近在开发一个基于网络的模块&#xff0c;目标是将这个在CAsyncSocket基础上开发的扩展类&#xff0c;进行有效的封装&#xff0c;向应用程序提供模块化的功能&a…