Untitled
unknown
plain_text
2 years ago
2.0 kB
3
Indexable
#include <iostream> using namespace std; #define maxn 1001 #define maxm 1000000 #define maxk 16 #define maxd 10000 int n, m, k, ans; int travel[maxk]; int contact[maxn][maxn]; int dis[maxn][maxn]; int vis[maxn]; void imports(){ cin >> n >> m >> k; for(int i = 0; i < k ; i++){ cin >> travel[i]; } int f, t; for(int i = 0; i < m; i++){ cin >> f >> t; cin >> contact[f][t]; } } void reset(){ for(int i = 0; i < maxk ; i++){ travel[i] = 0; } for(int i = 0; i < maxn; i++){ vis[i] = 0; for(int j = 0; j < maxn; j++){ contact[i][j] = 0; dis[i][j] = maxd; } } } void dijkstra(int source){ dis[source][source] = 0; // diem hien tai la source for(int i = 1; i <= n; i++){ // check tung diem int pos = -1; // tim diem lan can gan nhat cua source for(int j = 1; j <= n; j++){ if( vis[j] == 0){ if(pos == -1 || dis[source][j] < dis[source][pos]) pos = j; } } vis[pos] = 1; for(int j = 1; j <= n; j++){ if(contact[pos][j] != 0 && dis[source][pos] != maxd){ // neu j co lien ket voi pos va pos da xet khoang cach toi source if( dis[source][pos] + contact[pos][j] < dis[source][j]){ // neu khoang cach tu source toi j theo duong pos nho hon duong khac da xet dis[source][j] = dis[source][pos] + contact[pos][j]; } } } } } void backtrack(int pos, int sum){ if(sum > ans) return; if( pos == 1){ if(sum < ans) ans = sum; return; } for(int i = 0; i < n;i++){ if( dis[pos][i] == maxd) continue; backtrack(i, sum + dis[pos][i]); } } void exports(int tc){ for(int i = 0; i < n; i++){ dijkstra(i); } ans = maxd; backtrack(1, 0); if(ans == maxd) ans = -1; cout << "case #" << tc << endl; cout << ans << endl; } int main(){ freopen("input.txt","r",stdin); int t; cin >> t; for(int tc = 1; tc <= t; tc++){ reset(); imports(); exports(tc); } return 0; }
Editor is loading...