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;密码明文会泄露密码…

服务器安全之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&…

SSH 配置

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

架构师之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 到了服务器不能自动建表…

我是一个线程 [转]

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

自动化运维之–Cobbler

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

开源jumpserver 堡垒机搭建

一、环境 CentOS 6.x x86_64 mini service iptables stop 关闭SELinux的方法&#xff1a; 修改/etc/selinux/config文件中的SELINUX”” 为 disabled &#xff0c;然后重启。 如果不想重启系统&#xff0c;使用命令setenforce 0 1.指定yum源 wget -O /etc/yum.repos.d/e…

Shell 变量及函数讲解 [2]

Shell 变量的输入 Shell变量除了可以直接赋值或脚本传参外&#xff0c;还可以使用read命令从标准输入获得&#xff0c;read为bash内置命令&#xff0c;可以通过help read查看帮助【语法格式】read [参数] [变量名]【常用参数】-p prompt&#xff1a;设置提示信息-t timeout&…

java大作业私人管家系统_重庆管家婆软件丨管家婆工贸PRO的E-MES管理详解

其实&#xff0c;ERP和MES在制造操作中扮演着独立而又互补的角色。ERP能将企业所有方面的数据进行实时、可用的全面集成&#xff0c;为管理决策提供高效、准确的业务决策支持;MES则能加强MRP计划的执行&#xff0c;把MRP计划同车间作业现场控制通过执行系统联系起来。这些“现场…

监控体系 [精]

监控体系 zabbix 监控对象&#xff1a;     1. 监控对象的理解&#xff1a;CPU是怎么工作的&#xff0c;原理     2. 监控对象的指标&#xff1a;CPU使用率 CPU负载 CPU个数 上下文切换     3. 确定性能基准线&#xff1a;怎么样才算故障&#xff1f;CPU负载多…

vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...

一提到爸妈的朋友圈&#xff0c;就会想到养生鸡汤&#xff0c;中老年流量谣言&#xff0c;土味表情包而出于保护个人隐私拒绝被爸妈误解而遭受灵魂拷问的考虑很多人选择了两全其美的分组法给家人看到阳光可爱正能量的一面沙雕的一面只展现给沙雕网友们可如果不小心把屏蔽的内容…

KVM 安装

KVM介绍 Kernel-based Virtual Machine的简称&#xff0c;是一个开源的系统虚拟化模块&#xff0c;自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理&#xff0c;所以相对于Xen&#xff0c;其核心源码很少。KVM目前已成为学术界的主流VMM之…

彼聆智能语音机器人_电销行业的人工智能:智能语音电话机器人

随着人工智能的发展&#xff0c;越来越多的机器人出现在我们的日常生活中&#xff0c;用于电话营销公司的自动打电话机器人、快递公司用来送快递的机器人、餐厅里用来上菜的机器人&#xff0c;最近更是有一款会后空翻的机器人。机器人正活跃在各行各业中&#xff0c;代替人类去…

Shell 基础介绍 [1]

本文目录1.什么是Shell&#xff1f;2.脚本语言类型3.其他常用的脚本语句种类4.Shell脚本的建立和执行5.Shell 变量类型6.普通变量7.Shell 特殊重要变量8.Shell进程状态变量9.Parameter Expansion10.扩展&#xff1a;其他变量的替换11.变量的数值&#xff08;整数&#xff09;计…

c++创建二叉树_数据结构:查找(4)|| 平衡二叉树

在介绍平衡二叉树之前&#xff0c;应该先了解平衡因子的概念&#xff0c;平衡因子定义为左子树深度减去右子树深度&#xff0c;这个值的绝对值越大&#xff0c;非常容易理解它就对应着越不平衡的情况。一棵平衡的二叉树的平衡因子只能是1&#xff0c;0&#xff0c;-1如何构建一…

华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)

索尼从2020年12月9日开始&#xff0c;向开发者免费提供针对索尼数码相机的软件开发工具包“ Camera Remote SDK” 1.03版。“ Camera Remote SDK”开发的软件可以远程更改相机设置、并执行诸如快门释放&#xff0c;实时取景监视(如取景和对焦)之类的操作。支持的操作系统包括Wi…