Ճանապարհորդող վաճառողը դասական գրաֆիկական խնդիր է: Այստեղ բերված է i
քաղաքից j
քաղաք տեղափոխվելու արժեքը։ Խնդիրն է գտնել մի ուղի, որը սկսվում է 0
քաղաքից, որն առավելագույնը մեկ անգամ ընդգրկում է բոլոր այն քաղաքները, որոնց արժեքը ամենափոքրն է:
Խնդրի հայտարարություն.
Տրվում է M
չափի N
մատրիցա, որտեղ M[i][j]
նշանակում է i
քաղաք j
քաղաք տեղափոխելու արժեքը: Ձեր խնդիրն է շրջագայություն կատարել քաղաքից 0
(0-ի վրա հիմնված ինդեքս) դեպի բոլոր մյուս քաղաքները, որպեսզի այցելեք յուրաքանչյուր քաղաք առավելագույնը մեկ անգամ, իսկ վերջում վերադառնաք քաղաք 0
րոպեում:
Մուտքի ձևաչափ
Մուտքի առաջին տողը պարունակում է T ամբողջ թիվ, որը նշանակում է թեստային դեպքերի թիվը: Այնուհետև հետևում են T թեստի դեպքերը: Յուրաքանչյուր փորձնական դեպք պարունակում է N ամբողջ թիվ, որը նշանակում է մատրիցայի չափը, այնուհետև հաջորդ տողում կան N*N տարածության առանձնացված արժեքներ M մատրիցից:
Սահմանափակումներ
1<=T<=15, 1<=N<=12, 1<=M[][]<10000
Ելքի ձևաչափ
Յուրաքանչյուր փորձնական դեպքի համար նոր տողով տպեք պահանջվող արդյունքը, որը նշանակում է շրջագայության նվազագույն արժեքը:
Նմուշի մուտքագրում
2 2 0 111 112 0 3 0 1000 5000 5000 0 1000 1000 5000 0
Նմուշի արդյունք
223 3000
Նվազագույն արժեքով ուղին ցուցադրված է թավերով:
Ալգորիթմ
- Վերցրեք գրաֆիկի մուտքագրումը 2D մատրիցայի մեջ:
- Նախաձեռնեք
n
չափերի այցելված զանգվածը0
-ով: - Սահմանել
visited[0]
_ից1
: - Զանգի անցում arr-ով, cur node (
0
), այցելած հանգույցների քանակը (cnt = 1
), ընդհանուր արժեքը (0
), Քանի որ արդեն0th
հանգույցում, ուստի0th
հանգույցից0th
հանգույց անցնելու արժեքը0
է: - Ստուգեք if
cnt == n
. Եթե ճիշտ է, ապա մենք այցելել ենք բոլոր հանգույցները: Ներդրեք ans-ի նվազագույն չափը և (ընդհանուր + արժեքը ընթացիկ հանգույցից հանգույց 0 անցնելու համար)ans
: Հետո վերադարձիր։ - Կրկնել բոլոր հանգույցների միջով:
- Եթե
ith
հանգույցը չի այցելվում, և այն վավեր հանգույց է, ապա դարձրեքvisited[cur]=1
: Զանգի անցում կատարելով այն հանգույցը հավասարեցնելովcur
,cnt+1
-ին և ընդհանուր+արժեքը՝ cur-ից մինչևith
հանգույց (arr[cur][i]
):
C++ ներդրում
#include <iostream> #include <vector> #include <climits> using namespace std; int ans = INT_MAX, n; bool valid(int i) { return i >= 0 && i < n; } void traverse(vector<vector<int> >& arr, int cur, vector<int> visited, int cnt, int total) { // all nodes are visited if(cnt == n) { ans = min(ans, total + arr[cur][0]); // add the distance from last node to the 0th node return; } // explore all the paths that are not yet visited for(int i = 0; i < n; i++) { if(!visited[i] && valid(i)) { visited[i] = 1; traverse(arr, i, visited, cnt+1, total+arr[cur][i]); visited[i] = 0; // so that this node can be used in another sequence to check if min cost can be obtained } } } int main() { int t; cin>>t; while(t--) { cin>>n; vector<vector<int> > arr(n, vector<int>(n)); vector<int> visited(n, 0); ans = INT_MAX; // take the graph input for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cin>>arr[i][j]; } } visited[0] = 1; // check all possible path to find the min cost path traverse(arr, 0, visited, 1, 0); cout<<ans<<endl; } return 0; }
Խնդիրի հղումը՝ https://www.hackerrank.com/contests/target-samsung-13-nov19/challenges/travelling-salesman-4
Շնորհակալություն այս հոդվածը կարդալու համար: Հարցերի դեպքում թողեք մեկնաբանություն ստորև: Դուք կարող եք կապվել ինձ հետ LinkedIn,Twitter-ում: Արի, ասա բարև