给出N个城市,m条无向边。每个城市中都有一定数目的救援小组,所有边的边权已知。现在给出起点和终点,求从起点到终点的最短路径条数及最短经上的救缓小组数目只和。如果有多条最短路径,则输出数目只和最大的

Dijkstra 做法

#include<bits/stdc++.h>
using namespace std;
int n,m,s,u;
const int N=;
const int inf=0x3f3f3f3f;
int mp[N][N];
int dis[N];
bool vis[N];
int value[N];
int num[N];
int w[N];
void Dijkstra()
{
fill(vis,vis+N,false);
fill(dis,dis+N,inf);
fill(w,w+N,);
fill(num,num+N,);
num[s]=;//赋值
w[s]=value[s];//赋值
for(int i=;i<n;i++) dis[i]=mp[s][i];
dis[s]=;
for(int i=;i<n-;i++){
int u=-;
int minn=inf;
for(int j=;j<n;j++){
if(!vis[j]&&dis[j]<minn){
u=j;
minn=dis[j];
}
}
if(u==-) return;
vis[u]=true;
for(int j=;j<n;j++){
if(!vis[j]&&dis[u]+mp[u][j]<=dis[j]){
if(mp[u][j]+dis[u]<dis[j]){
dis[j]=mp[u][j]+dis[u];
num[j]=num[u];
w[j]=w[u]+value[j];
}
else{
num[j]+=num[u];
if(w[u]+value[j]>w[j]){
w[j]=w[u]+value[j];
}
}
}
} }
}
int main()
{
scanf("%d %d %d %d",&n,&m,&s,&u);
for(int i=;i<n;i++) scanf("%d",&value[i]);
memset(mp,inf,sizeof(mp));
while(m--){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
mp[a][b]=mp[b][a]=c;
}
Dijkstra();
printf("%d %d",num[u],w[u]); return ;
}

spfa做法

#include<bits/stdc++.h>

using namespace std;
int n,m,s,v;
struct node
{
int to;
int dis;
node(int _to=,int _dis=):to(_to),dis(_dis){}
};
const int N=;
int dis[N];
bool vis[N];
int w[N];
int num[N];
int value[N];
vector<node>mp[N];
set<int>st[N];
const int inf=0x3f3f3f3f;
void spfa()
{
fill(dis,dis+N,inf);
fill(vis,vis+N,false);
fill(w,w+N,);
w[s]=value[s];
num[s]=;
queue<int>Q;
Q.push(s);
vis[s]=true;
dis[s]=;
while(!Q.empty()){
int u=Q.front();
Q.pop();
vis[u]=false;
for(int i=;i<mp[u].size();i++){
int to=mp[u][i].to;
int diss=mp[u][i].dis;
if(diss+dis[u]<dis[to]){
dis[to]=diss+dis[u];
w[to]=w[u]+value[to];
num[to]=num[u];
st[to].clear();
st[to].insert(u);
if(!vis[to]){
Q.push(to);
vis[to]=true;
}
}
else if(diss+dis[u]==dis[to]){
if(w[to]<w[u]+value[to]){
w[to]=w[u]+value[to];
}
st[to].insert(u);
num[to]=;//因为spfa会重复到一个点 所以可能重复的边
for(set<int>::iterator it=st[to].begin();it!=st[to].end();++it){
num[to]+=num[*it];
}
if(!vis[to]){
Q.push(to);
vis[to]=true;
}
}
}
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&s,&v);
for(int i=;i<n;i++) scanf("%d",&value[i]);
for(int i=;i<n;i++) mp[i].clear();
while(m--){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
mp[a].push_back(node(b,c));
mp[b].push_back(node(a,c));
}
spfa();
printf("%d %d\n",num[v],w[v]); return ;
}

1003 Emergency (25 分)(求最短路径)的更多相关文章

  1. 1003 Emergency (25分) 求最短路径的数量

    1003 Emergency (25分)   As an emergency rescue team leader of a city, you are given a special map of ...

  2. PAT 1003 Emergency (25分)

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  3. 1003 Emergency (25分)

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  4. 【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)

    题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人.(N<=500) AAAAAccepted code: #in ...

  5. PAT 1003. Emergency (25) dij+增加点权数组和最短路径个数数组

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  6. PAT 解题报告 1003. Emergency (25)

    1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...

  7. PAT 1003. Emergency (25)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  8. 1003 Emergency (25)(25 point(s))

    problem 1003 Emergency (25)(25 point(s)) As an emergency rescue team leader of a city, you are given ...

  9. PAT 甲级 1003. Emergency (25)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  10. PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

随机推荐

  1. 【luogu P3390 矩阵快速幂】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3390 首先要明白矩阵乘法是什么 对于矩阵A m*p  与  B p*n 的矩阵 得到C m*n 的矩阵 矩阵 ...

  2. 运用Xdebug调试和优化PHP程序

    什么是Xdebug? Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况.Xdebug现在的最新版本是xdebug 2.0.0beta ...

  3. js使用hover事件做一个“个人中心”的浮动层

    原材料知识点:hover html: css:

  4. Go转json数组

    Go转json数组 最近因需要要调用gitlab的API,其中有一个是根据私有token获取Repositories列表 由于返回结果是一个json数组,单纯使用json.Unmarshal没法实现, ...

  5. 关系型数据库设计——E-R图

    一.数据管理技术的三个发展阶段: 1)人工管理阶段(20世纪50年代中期) 特点:数据不保存:应用程序管理数据:数据不共享:数据没有独立性: 2)文件系统阶段(20世纪50年代后—60年代)特点:数据 ...

  6. 【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9244783.html   直接先上例子 >>> re.search('(book+ ...

  7. let's encrypt部署免费泛域名证书

    环境说明 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhos ...

  8. Hello,移动WEB—px,dp,dpr像素基础

    问题点1:iphone5分辨率:640 * 1136 dp,为什么chrome浏览器F12中显示的320 *568??         iPhone5 分辨率640 * 1136指的是物理像素,而实际 ...

  9. Symfony FOSUserBundle用户登录验证

    symfony是一个由组件构成的框架,登录验证的也是由一些组件构成,下面就介绍一下FOSUserBundle的使用. 以symfony 3.3为例, 首先我们需要先安装一下FOSUserBundle. ...

  10. 【Markdown】Markdown的使用(自用)

    # 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录 ...