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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

week7 TT的旅行日记

發布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 week7 TT的旅行日记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Title

Input

Output

樣例
input
4 1 4
4
1 2 2
1 3 3
2 4 4
3 4 5
1
2 4 3
output
1 2 4
2
5

分析

  • 給定起點S和終點S,分別求出起點和終點到各個點的花費,存儲在disS和disE。
  • 枚舉每一條商業線(u,v,w),則如果使用這條商業線,最小花費為min(disS[u]+dis[v]+w, disE[u]+disS[v]+w)。找出使用一條商業線的最小花費。
  • 使用商業線的最小花費與不使用商業線的最小花費作比較,誰小取誰。
  • 在求取起點和終點到各個距離的花費,使用的是dijkstra。
  • 有可能必須需要一條商業線才能到達,這種情況下,不添加商業線時,起點和終點不連通 ,互不相通的點花費為無窮,枚舉商業線的時候也能選到在加上商業線后最小的花費。
    總結
    寫代碼的時候,寫的是while(scanf())導致一直runtime error,/(ㄒoㄒ)/~~。
    注意在枚舉商業線(u,v,w)時,如果判斷得到的最小花費是disS[u]+dis[v]+w,則該商業線記為(u,v)。若選用的是disE[u]+disS[v]+w,則記錄的為(v,u),因為是從終點方向來的。
#include<stdio.h> #include<queue> #include<string.h> using namespace std; #define rangeEdge 2000+10 #define maxW 100000000 #define range 500+10 struct qNode {int first;int second;qNode(int f = 0, int s = 0){first = f;second = s;}bool operator<(const qNode& b)const{return first > b.first;} }; struct Edge {int v, w, nxt;Edge(int tv, int tw, int tnxt){v = tv; w = tw; nxt = tnxt;}Edge(){v = 0; w = 0; nxt = 0;} }; int ecoNum = 0, N = 0, S = 0, E = 0, M = 0, K = 0, flag = 0; int ecohead[range], vis[range], disS[range], disE[range], preS[range], preE[range]; Edge eco[rangeEdge]; void addeco(int tu, int tv, int tw) {eco[ecoNum].v = tv; eco[ecoNum].w = tw; eco[ecoNum].nxt = ecohead[tu];ecohead[tu] = ecoNum;ecoNum++; } void dijkstra(int s, int* dis, int* pre) {priority_queue<qNode> q;for (int i = 0; i < range; i++){dis[i] = maxW;vis[i] = 0;pre[i] = 0;}dis[s] = 0;pre[s] = -1;q.push(qNode(0, s));while (!q.empty()){int now = q.top().second;q.pop();if (vis[now]) continue;vis[now] = 1;for (int i = ecohead[now]; i != -1; i = eco[i].nxt){int next = eco[i].v, w = eco[i].w;if (dis[next] > dis[now] + w){dis[next] = dis[now] + w;pre[next] = now;q.push(qNode(dis[next], next));}}} }void outputS(int x) {if (x == S){printf("%d", x);return;}outputS(preS[x]);printf(" %d", x); } void outputE(int x) {while (x != E){printf(" %d", x);x = preE[x];}printf(" %d", x); } int main() {while (scanf("%d %d %d", &N, &S, &E)!=EOF){ecoNum = 0;int tempu = 0, tempv = 0, tempw = 0;memset(ecohead, -1, sizeof(ecohead));scanf("%d", &M);while (M--){scanf("%d %d %d", &tempu, &tempv, &tempw);addeco(tempu, tempv, tempw);addeco(tempv, tempu, tempw);}dijkstra(S, disS, preS);dijkstra(E, disE, preE);scanf("%d", &K);int busa = -1, busb = -1, mindis = disS[E];while (K--){int u = 0, v = 0, w = 0;scanf("%d %d %d", &u, &v, &w);int d1 = disS[u] + disE[v] + w;int d2 = disE[u] + disS[v] + w;if (mindis > d1){mindis = d1;busa = u; busb = v;}if (mindis > d2){mindis = d2;busa = v; busb = u;}}if (flag > 0) printf("\n");if (busa == -1)//沒有用商業線{outputS(E);printf("\nTicket Not Used\n");printf("%d\n", mindis);}else{outputS(busa);//S-busaoutputE(busb);//busb-Eprintf("\n%d\n%d\n", busa, mindis);}flag++;}return 0; }

總結

以上是生活随笔為你收集整理的week7 TT的旅行日记的全部內容,希望文章能夠幫你解決所遇到的問題。

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