2021-04-06 PAT A1087

测试点2不过的原因,是更新路径条数的时候,不是加上它前驱的所有路径条数,而是只加一
纯DIJSTRA实现
这道题做的真的好幸福啊,因为是都没怎么调,就做出来了,让我对DIJSTRA的认识又进一步了

#include<cstdio>
#include<utility>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 26 * 26 * 26 + 5, INF = 0x3fffffff;
vector<pair<int, int> > graph[maxn];//first是id second是cost
int happyValue[maxn], level[maxn], dis[maxn], city_num, happy_sum[maxn], pre[maxn], path[maxn], star_id;//level用来记录层数,最后层数最少的就是平均幸福值最低的
bool vis[maxn];
int getID(char* name) {
    int id = 0;
    for (int i = 0; i < 3; i++)
        id = id * 26 + name[i] - 'A';
    return id;
}
void print_name(int id) {
    char name[6]; name[3] = '\0';
    for (int i = 2; i >= 0; i--) {
        int temp = id % 26;
        id /= 26;
        name[i] = temp + 'A';
    }
    printf("%s", name);
}
void DIJSTRA(int source) {
    fill(dis, dis + maxn, INF);
    priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
    q.push(pair<int, int>(0, source)); dis[source] = 0; path[source] = 1; level[source] = 0;
    pre[source] = source;
    for (int i = 0; i < city_num; i++) {
        if (q.empty())break;
        pair<int, int> temp = q.top(); q.pop();
        int u = temp.second; vis[u] = true;
        //print_name(u); printf(" ");
        for (int j = 0; j < graph[u].size(); j++) {
            int v = graph[u][j].first, cost = graph[u][j].second;
            //print_name(v); printf("\n");
            if (!vis[v]) {
                if (dis[v] > dis[u] + cost) {
                    level[v] = level[u] + 1;
                    dis[v] = dis[u] + cost;
                    happy_sum[v] = happy_sum[u] + happyValue[v];
                    pre[v] = u;
                    q.push(pair<int, int>(dis[v], v));
                    path[v] = path[u];
                }
                else if (dis[v] == dis[u] + cost) {
                    path[v] += path[u];
                    if (happy_sum[v] < happy_sum[u] + happyValue[v]) {
                        level[v] = level[u] + 1;
                        happy_sum[v] = happy_sum[u] + happyValue[v];
                        pre[v] = u;
                    }
                    else if (happy_sum[v] == happy_sum[u] + happyValue[v] && level[u] + 1 < level[v]) {//层数越少,那么快乐平均值越高
                        level[v] = level[u] + 1;
                        pre[v] = u;
                    }
                }
            }
        }
    }
}
void DFS(int source) {
    if (source == star_id) print_name(source);
    else {
        DFS(pre[source]);
        printf("->");
        print_name(source);
    }

}
int main() {
    char city1[6], city2[6], strdes[6];//最后这个用来记录出发的地点
    int k, cost; scanf("%d %d %s", &city_num, &k, strdes); getchar();
    star_id = getID(strdes);
    for (int i = 1; i < city_num; i++) {
        scanf("%s", city1);
        scanf("%d", &happyValue[getID(city1)]);
    }
    for (int i = 0; i < k; i++) {
        scanf("%s %s %d", city1, city2, &cost); getchar();
        int id1 = getID(city1), id2 = getID(city2);
        graph[id1].push_back(pair<int, int>(id2, cost));
        graph[id2].push_back(pair<int, int>(id1, cost));
    }
    DIJSTRA(star_id);
    char end_name[] = "ROM";
    int end = getID(end_name);
    printf("%d %d %d %d\n", path[end], dis[end], happy_sum[end], happy_sum[end] / level[end]);
    DFS(end);printf("\n");
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容