日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7-2 城市间紧急救援 (25 分)

發布時間:2024/7/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-2 城市间紧急救援 (25 分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作為一個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連接城市的快速道路。每個城市的救援隊數量和每一條連接兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助電話給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。

輸入格式:
輸入第一行給出4個正整數N、M、S、D,其中N(2≤N≤500)是城市的個數,順便假設城市的編號為0 ~ (N?1);M是快速道路的條數;S是出發地的城市編號;D是目的地的城市編號。

第二行給出N個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨后的M行中,每行給出一條快速道路的信息,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。

輸出格式:
第一行輸出最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從S到D的路徑中經過的城市編號。數字間以空格分隔,輸出結尾不能有多余空格。

輸入樣例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
輸出樣例:
2 60
0 1 3

主要思想是:裸的Dijkstra,問題是如何計算最短路徑條數,其實遵循這樣兩條原則:

  • 如果A到B只有一條路可以走,那么到B的路條數就是到A的條數
  • 如果不是一條路,就把所有的路加起來。
  • #include <bits/stdc++.h> using namespace std; int Map[501][501]; //記錄圖的邊信息 int peo[501]; //截止走到此處積累的人數 int Count[501]; //走到此處的方法數 int vis[501]; //此點是否已經走過 int Path[501]; //記錄路徑 int dist[501]; int ph[501]; //people here:此點的人數 int n,s,d; void path(int d); int main() {int m;cin>>n>>m>>s>>d;for (int i=0;i<n;i++)//初始化 {Path[i]=-1;dist[i]=1000000;cin>>ph[i];for (int j=0;j<n;j++){Map[i][j]=1000000;}}dist[s]=0; //起點到起點的距離是0 Count[s]=1; //起點到起點一種方式 vis[s]=1; //將起點放入集合 peo[s]=ph[s]; //走到起點的人數就是起點的人數 int c1,c2,len; //輸入使用 for (int i=0;i<m;i++) //輸入邊的信息 {cin>>c1>>c2>>len;Map[c1][c2]=len;Map[c2][c1]=len;}for (int i=0;i<n;i++){if (Map[s][i]!=1000000){dist[i]=Map[s][i];}} //初始化完成 int min=s,minf; //min存放最小值下標,minf存放最小值 for (int i=1;i<n;i++) //只需要循環n-1次,因為每次會挑選一個最小值,起點已經進入集合 {if (i==1){minf=dist[s];}else{minf=1000000;}for (int j=0;j<n;j++){if (!vis[j]&&dist[j]<minf) //挑選最小值 {min=j;minf=dist[j];}}vis[min]=1; //最小值放入集合for (int j=0;j<n;j++){if (vis[j]==0&&Map[min][j]!=1000000&&dist[min]+Map[min][j]<dist[j])//需要更新 {dist[j]=dist[min]+Map[min][j];Path[j]=min;Count[j]=Count[min]; //直線走過來,這點到達的方式和前驅相同peo[j]=peo[min]+ph[j]; //人手積累 }else if (vis[j]==0&&Map[min][j]!=1000000&&dist[min]+Map[min][j]==dist[j])//相等,需要看人手{Count[j]+=Count[min]; //不管怎樣,來著的方法要加1if (peo[min]+ph[j]>peo[j])//這條道路搖人更多 {peo[j]=peo[min]+ph[j];Path[j]=min; //換線 }}}}printf("%d %d\n",Count[d],peo[d]);path(d);printf("%d",d);return 0; }void path(int d) {if(Path[d] != -1) {path(Path[d]);printf("%d ", Path[d]);} }

    總結

    以上是生活随笔為你收集整理的7-2 城市间紧急救援 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。