本文共 3378 字,大约阅读时间需要 11 分钟。
第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。再接下来m行,每行3个空格分隔的整数x, y, z (0<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。输入保证从start到end至少有一条路径。
一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
3 2 0 21 2 30 1 101 2 11
21 6
#include#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int MAXN = 500+5;const int MAXM = MAXN*MAXN;struct Edge{ int to,w; Edge(int pt,int pw){ to = pt; w = pw; } bool operator<(const Edge o)const{ return w > o.w; }};bool vis[MAXN];int score[MAXN];//某个房间的分数值ll res[MAXN];//记录到某点的最大分数ll dis[MAXN];//记录到某点的最短路priority_queue pq;int n,m,start,end;vector adj[MAXN];void dijkstra(int s,int end){ memset(vis,false,sizeof(vis)); memset(dis,INF,sizeof(dis)); dis[s] = 0; for(int i = 0; i < n; ++i){ res[i] = i == s ? score[i] : 0;//初始化起点到某个点的最大分数值 } pq.push(Edge(s,0)); while(!pq.empty()){ Edge e = pq.top(); int cur = e.to; pq.pop(); vis[cur] = true; for(int i = 0; i < adj[cur].size(); ++i){ Edge e = (Edge)adj[cur][i]; if(vis[e.to]) continue;//已经访问的点不在入队 if(dis[e.to] > dis[cur] + e.w){ dis[e.to] = dis[cur] + e.w; res[e.to] = score[e.to] + res[cur]; pq.push(Edge(e.to,dis[e.to])); } else if(dis[e.to] == dis[cur] + e.w){//最短路相同时取分数最大的 res[e.to] = max(res[e.to],res[cur]+score[e.to]); } } } printf("%d %d",dis[end],res[end]); } int main() { cin >> n >> m >> start >> end; for(int i = 0; i < n; ++i){ scanf("%d",&score[i]); } int f,t,w; for(int i = 0; i < m; ++i){ cin >> f >> t >> w; adj[f].push_back(Edge(t,w)); adj[t].push_back(Edge(f,w)); } dijkstra(start,end); return 0; }
#include#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int MAXN = 500+5;const int MAXM = MAXN*MAXN;struct Edge{ int to,w; Edge(int pt,int pw){ to = pt; w = pw; } bool operator<(const Edge o)const{ return w > o.w; }};int pre[MAXN];bool vis[MAXN];int score[MAXN];ll dis[MAXN];priority_queue pq;int n,m,start,end;vector adj[MAXN];ll getSum(int e,int sum){ if(pre[e] == -1){ return sum + score[e]; } else{ getSum(pre[e],sum+score[e]); } }void dijkstra(int s,int end){ memset(pre,-1,sizeof(pre)); memset(vis,false,sizeof(vis)); memset(dis,INF,sizeof(dis)); dis[s] = 0; pq.push(Edge(s,0)); while(!pq.empty()){ Edge e = pq.top(); int cur = e.to; pq.pop(); vis[cur] = true; for(int i = 0; i < adj[cur].size(); ++i){ Edge e = (Edge)adj[cur][i]; if(vis[e.to]) continue; if(dis[e.to] > dis[cur] + e.w){ dis[e.to] = dis[cur] + e.w; pre[e.to] = cur; pq.push(Edge(e.to,dis[e.to])); } else if(dis[e.to] == dis[cur] + e.w){ if(score[cur] > score[pre[e.to]]){ pre[e.to] = cur; } } } } ll sum = getSum(end,0); printf("%d %d",dis[end],sum); } int main() { cin >> n >> m >> start >> end; for(int i = 0; i < n; ++i){ scanf("%d",&score[i]); } int f,t,w; for(int i = 0; i < m; ++i){ cin >> f >> t >> w; adj[f].push_back(Edge(t,w)); adj[t].push_back(Edge(f,w)); } dijkstra(start,end); return 0; }
转载地址:http://mhimi.baihongyu.com/