ZOJ 2526 FatMouse and JavaBean II
博客搬新家,以后就是基本只在自己的独立博客进行更新,欢迎访问。http://zihengoi.cn
题目描述:
题目链接:ZOJ 2526 FatMouse and JavaBean II
题目大意:
给一个起点和终点。再给一些图中点的关系路。从起点到终点的最短路径有多少条。如果存在多条最短路,则求能得到
javabean
最多的一条路,输出得到
javabean
的数量,并输出该条路的路径。
解题思路:
用
Dijkstra
记录最短路径。如果出现相同的最短路则更新路的条数,并在
javabean
多的时候更新状态并记录下路径即可。
复杂度分析:
时间复杂度 :
O(n2)
空间复杂度 :
O(n)
AC代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int maxn = 510;
const int INF = 0x3fffffff;
struct Edge{
int from,to,dist;
};
struct Heapnode{
int d,u;
bool operator < (const Heapnode& rhs) const{
return d > rhs.d;
}
};
bool done[maxn];
vector<Edge> edges;
vector<int> G[maxn];
int n,m,m1,rm1,rm2;
int jb[maxn], sumjb[maxn], d[maxn], p[maxn],ans[maxn],path[maxn];
void dijkstra(int s){
priority_queue<Heapnode>Q;
for(int i = 0; i < n; i++){
d[i] = INF;
sumjb[i] = 0;
ans[i] = 1;
}
memset(done,false,sizeof(done));
for(int i = 0; i < m1; i++) p[i] = s;
d[s] = 0;
sumjb[s] = jb[s];
Q.push((Heapnode){0,s});
while(!Q.empty())
{
Heapnode x = Q.top();
Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
for(int i = 0; i < G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist)
{
d[e.to] = d[u] + e.dist;
sumjb[e.to] = sumjb[u] + jb[e.to];
ans[e.to] = ans[u];
p[e.to] = G[u][i];
Q.push((Heapnode){d[e.to],e.to});
}
else if(d[e.to] == d[u] + e.dist){
ans[e.to] += ans[u];
if(sumjb[e.to] < sumjb[u] + jb[e.to]){
sumjb[e.to] = sumjb[u] + jb[e.to];
p[e.to] = G[u][i];
Q.push((Heapnode){d[e.to],e.to});
}
}
}
}
}
int main()
{
while(scanf("%d%d%d%d",&n,&m,&rm1,&rm2) != EOF){
int from,to,dist;
for(int i = 0; i < n; i++) G[i].clear();
edges.clear();
m1 = 0;
for(int i = 0; i < n; i++) scanf("%d",&jb[i]);
for(int i = 0; i < m; i++){
scanf("%d%d%d",&from,&to,&dist);
edges.push_back((Edge){from,to,dist});
G[from].push_back(m1++);
edges.push_back((Edge){to,from,dist});
G[to].push_back(m1++);
}
dijkstra(rm1);
printf("%d %d\n",ans[rm2],sumjb[rm2]);
m1 = 1,path[0] = rm2;
while(rm1 != rm2){
path[m1++] = edges[p[rm2]].from;
rm2 = edges[p[rm2]].from;
}
for(int i = m1-1; i > 0; i--)printf("%d ",path[i]);
printf("%d\n",path[0]);
}
return 0;
}