Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #define all(container) container.begin(), container.end()
- #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter)
- #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter)
- #define vec(type) std::vector<type>
- #define dvec(type) std::vector<std::vector<type>>
- #define cout(val) std::cout << val << std::endl;
- struct town {
- int t;
- int num;
- };
- int n, m, tim, ans = 1000000, c = 1;
- dvec(town) map;
- vec(int) road;
- vec(bool) edge(22, false);
- vec(int) count(22, 0);
- void check(vec(int)& temp, vec(bool)& done) {
- bool f = true;
- fors(i, 0, done.size()) {
- if (!done[i]) {
- f = false;
- break;
- }
- }
- if (f && ans > tim) {
- ans = tim;
- road = {};
- fors(i, 0, m) {
- if (edge[i])
- road.push_back(i);
- }
- }
- }
- void dfs(vec(int)& temp, int v, vec(bool)& done) {
- done[v] = true;
- fors(i, 0, map[v].size()) {
- if (!done[map[v][i].t] && edge[map[v][i].num]) {
- dfs(temp, map[v][i].t, done);
- }
- }
- check(temp, done);
- }
- void rec(int d) {
- if (d < m) {
- fors(i, d + 1, m) {
- edge[i] = true; c++;
- tim += count[i];
- if (c == n) {
- vec(int) temp; vec(bool) done(n, false);
- dfs(temp, 0, done);
- }
- rec(i);
- edge[i] = false; c--;
- tim -= count[i];
- }
- }
- }
- int main() {
- std::ifstream fin("input.txt");
- fin >> n >> m;
- map.resize(n);
- fors(i, 0, m) {
- int u, c;
- town temp;
- fin >> u >> temp.t >> c;
- temp.t--; u--;
- temp.num = i;
- count[i] = c;
- map[u].push_back(temp);
- }
- rec(-1);
- if (ans == 1000000) {
- ans = 0;
- }
- std::cout << ans << " " << road.size() << std::endl;
- fors(i, 0, road.size()) {
- std::cout << road[i] + 1 << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment