赞
踩
7-44 直捣黄龙 (30分)
本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营。当这样的路径不唯一时,要求选择可以沿途解放最多城镇的路径。若这样的路径也不唯一,则选择可以有效杀伤最多敌军的路径。
输入第一行给出2个正整数N
(2 ≤ N
≤ 200,城镇总数)和K
(城镇间道路条数),以及己方大本营和敌方大本营的代号。随后N
-1行,每行给出除了己方大本营外的一个城镇的代号和驻守的敌军数量,其间以空格分隔。再后面有K
行,每行按格式城镇1 城镇2 距离
给出两个城镇之间道路的长度。这里设每个城镇(包括双方大本营)的代号是由3个大写英文字母组成的字符串。
按照题目要求找到最合适的进攻路径(题目保证速度最快、解放最多、杀伤最强的路径是唯一的),并在第一行按照格式己方大本营->城镇1->...->敌方大本营
输出。第二行顺序输出最快进攻路径的条数、最短进攻距离、歼敌总数,其间以1个空格分隔,行首尾不得有多余空格。
- 10 12 PAT DBY
- DBY 100
- PTA 20
- PDS 90
- PMS 40
- TAP 50
- ATP 200
- LNN 80
- LAO 30
- LON 70
- PAT PTA 10
- PAT PMS 10
- PAT ATP 20
- PAT LNN 10
- LNN LAO 10
- LAO LON 10
- LON DBY 10
- PMS TAP 10
- TAP DBY 10
- DBY PDS 10
- PDS PTA 10
- DBY ATP 10

- PAT->PTA->PDS->DBY
- 3 30 210
写的很舒服,dijkstra多条件注意判断即可
- //时间最短,经过节点最多,有效杀伤最多
- #include <bits/stdc++.h>
- #define Max 202
- #define inf 0x3f3f3f3f
- using namespace std;
- int n, k;
- string st, endd;
- string u, v;
- int peo;
- map<string, int> HASH; //映射
- map<int, string> unHASH; //反映射
- int mapp[Max][Max];
- int vis[Max];
- int nodes[Max];//节点
- int kills[Max];//记录到每个点最多的杀敌数
- int cont[Max];// 每个城市的敌人数量
- int pre[Max]; //路径的前导
- int dis[Max]; //距离
- int short_path[Max];//每个点最短路径有多少条
- void dfs(int x) {
- if(pre[x] != HASH[st]) {
- dfs(pre[x]);
- }
- cout << unHASH[pre[x]] << "->";
- }
- void dijkstra(int st) {
- memset(dis, inf, sizeof(dis));
- memset(kills, 0, sizeof(kills));
- memset(short_path, 0, sizeof(short_path));
- memset(nodes, 0, sizeof(nodes));
-
- memset(vis, 0, sizeof(vis));
- for(int i = 1; i <= n; i++) pre[i] = i;
- dis[st] = 0;
- short_path[st] = 1;
- nodes[st] = 1;
- kills[st] = cont[st];
- for(int i = 1; i <= n; i++) {
- int u = -1, minn = inf;
- for(int j = 1; j <= n; j++) {
- if(!vis[j] && dis[j] < minn) {
- minn = dis[j];
- u = j;
- }
- }
- if(u == -1) break;
- vis[u] = 1;
- for(int v = 1; v <= n; v++) {
- if(!vis[v]) {
- if(dis[v] > dis[u] + mapp[u][v]) {
- dis[v] = dis[u] + mapp[u][v];
- pre[v] = u;
- kills[v] = kills[u] + cont[v];
- nodes[v] = nodes[u] + 1;
- short_path[v] = short_path[u];
- } else if(dis[v] == dis[u] + mapp[u][v] && nodes[v] < nodes[u] + 1) {
- nodes[v] = nodes[u] + 1;
- pre[v] = u;
- kills[v] = kills[u] + cont[v];
- short_path[v] += short_path[u];
- } else if(dis[v] == dis[u] + mapp[u][v] && nodes[v] == nodes[u] + 1 && kills[v] < kills[u] + cont[v]) {
- kills[v] = kills[u] + cont[v];
- nodes[v] = nodes[u] + 1;
- pre[v] = u;
- short_path[v] += short_path[u];
- } else if(dis[v] == dis[u] + mapp[u][v]) { //当最短路径不唯一时记录路径条数
- short_path[v] += short_path[u];
- }
- }
- }
- }
- }
- int main() {
- memset(cont, 0, sizeof(cont));
- memset(mapp, inf, sizeof(mapp));
- cin >> n >> k;
- cin >> st >> endd;
- HASH[st] = 1;
- unHASH[1] = st;
- for(int i = 2; i <= n; i++) {
- cin >> u >> peo;
- HASH[u] = i;
- unHASH[i] = u;
- cont[i] = peo;
- }
- for(int i = 0; i < k; i++) {
- cin >> u >> v >> peo;
- mapp[HASH[u]][HASH[v]] = peo;
- mapp[HASH[v]][HASH[u]] = peo;
- }
- dijkstra(HASH[st]);
- dfs(HASH[endd]);
- cout << endd << endl;
- cout << short_path[HASH[endd]] << " " << dis[HASH[endd]] << " " << kills[HASH[endd]] << endl;
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。