學習《演算法競賽入門經典訓練指南》
思考:機場快線
1.對起點和終點呼叫dijkstra
2.列舉所有的商業線(包含沒有使用商業線車票),計算從起點到a,a->b,b->終點,並與最小做對比
(考慮到所有線路都是雙向的,需要比較兩次)
3.列印出訪問順序給出經過的車站。
可能需要用到路徑尋找函式find
對於函式find,因為所有點到目標點之間的最短路已經求出
首先求出起始點到目標點之間的距離d[i]
如果有點j使得最短路d[j]+weight(j,i)=d[i],那麼j必然是前乙個點
使用find列舉求出點j,得到邊j->i
**:
// uva11374 airport express
// rujia liu
#include#include#include#includeusing namespace std;
const int inf = 1000000000;
const int maxn = 500 + 10;
struct edge ;
struct heapnode
};struct dijkstra
void addedge(int from, int to, int dist) );
m = edges.size();
g[from].push_back(m-1);
} void dijkstra(int s) );
while(!q.empty()) );}}
}} // dist[i]為s到i的距離,paths[i]為s到i的最短路徑(經過的結點列表,包括s和t)
void getshortestpaths(int s, int* dist, vector* paths)
reverse(paths[i].begin(), paths[i].end());
}}};
題目相關
dijkstra solver;
int d1[maxn], d2[maxn];
vectorpaths1[maxn], paths2[maxn];
int main()
solver.getshortestpaths(s, d1, paths1); // s到所有點的距離和路徑
solver.getshortestpaths(e, d2, paths2); // t到所有點的距離和路徑
int ans = d1[e]; // 初始解解為直達距離
vectorpath = paths1[e]; // 初始解的station序列
int midpoint = -1; // 不坐商業線
scanf("%d", &k);
for(int i = 0; i < k; i++)
swap(x, y);}}
if(kase != 0) printf("\n");
kase++;
for(int i = 0; i < path.size()-1; i++) printf("%d ", path[i]+1);
printf("%d\n", e+1);
if(midpoint == -1) printf("ticket not used\n"); else printf("%d\n", midpoint+1);
printf("%d\n", ans);
} return 0;
}
1137 矩陣乘法
1137 矩陣乘法 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出2個n n的矩陣m1和m2,輸出2個矩陣相乘後的結果。input 第1行 1個數n,表示矩陣的大小 2 n 100 第2 n 1行,每行n個數,對應m1的1行 0 m1 i 1000 第n 2 2n ...
Wikioi P1137 計算係數
題目描述 description 給定乙個多項式 ax by k,請求出多項式展開後x n y m項的係數。輸入描述 input description 共一行,包含 5 個整數,分別為a,b,k,n,m,每兩個整數之間用乙個空格隔開。輸出描述 output description 輸出共 1 行,...
CODEVS 1137 計算係數
題目描述 description 給定乙個多項式 ax by k,請求出多項式展開後x n y m項的係數。輸入描述 input description 共一行,包含 5 個整數,分別為a,b,k,n,m,每兩個整數之間用乙個空格隔開。輸出描述 output description 輸出共 1 行,...