2021-04-06 PAT A1087

測試點2不過的原因,是更新路徑條數(shù)的時候诞外,不是加上它前驅(qū)的所有路徑條數(shù),而是只加一
純DIJSTRA實現(xiàn)
這道題做的真的好幸福啊灾票,因為是都沒怎么調(diào)峡谊,就做出來了,讓我對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用來記錄層數(shù),最后層數(shù)最少的就是平均幸福值最低的
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]) {//層數(shù)越少既们,那么快樂平均值越高
                        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];//最后這個用來記錄出發(fā)的地點
    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");
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末濒析,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啥纸,更是在濱河造成了極大的恐慌号杏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斯棒,死亡現(xiàn)場離奇詭異盾致,居然都是意外死亡,警方通過查閱死者的電腦和手機荣暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門庭惜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人穗酥,你說我怎么就攤上這事护赊。” “怎么了砾跃?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵骏啰,是天一觀的道長。 經(jīng)常有香客問我抽高,道長器一,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任厨内,我火速辦了婚禮祈秕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雏胃。我一直安慰自己请毛,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布瞭亮。 她就那樣靜靜地躺著方仿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统翩。 梳的紋絲不亂的頭發(fā)上仙蚜,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音厂汗,去河邊找鬼委粉。 笑死,一個胖子當著我的面吹牛娶桦,可吹牛的內(nèi)容都是我干的贾节。 我是一名探鬼主播汁汗,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栗涂!你這毒婦竟也來了知牌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤斤程,失蹤者是張志新(化名)和其女友劉穎角寸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿墅,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡袭厂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了球匕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纹磺。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亮曹,靈堂內(nèi)的尸體忽然破棺而出橄杨,到底是詐尸還是另有隱情,我是刑警寧澤照卦,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布式矫,位于F島的核電站,受9級特大地震影響役耕,放射性物質(zhì)發(fā)生泄漏采转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一瞬痘、第九天 我趴在偏房一處隱蔽的房頂上張望故慈。 院中可真熱鬧,春花似錦框全、人聲如沸察绷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆撼。三九已至,卻和暖如春喘沿,著一層夾襖步出監(jiān)牢的瞬間闸度,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工蚜印, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莺禁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓晒哄,卻偏偏與公主長得像睁宰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寝凌,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容