生活随笔
收集整理的這篇文章主要介紹了
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
);outputE(busb
);printf("\n%d\n%d\n", busa
, mindis
);}flag
++;}return 0;
}
總結
以上是生活随笔為你收集整理的week7 TT的旅行日记的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。