#include "bits/stdc++.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma GCC optimize("Ofast") #pragma GCC target("sse2") #pragma warning(disable:4996) using namespace std; using ld = long double; template using Table = vector>; const ld eps=1e-9; using Graph=vector>; using ll=long long; #define WHATS(var)cout<<__LINE__<<' '<<#var<<"="< ostream& operator <<(ostream &os, const pair v){ os << "( " << v.first << ", " << v.second << ")"; return os; } template ostream& operator <<(ostream &os, const vector &v){ for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os; } template ostream& operator <<(ostream &os, const vector> &v){ for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os; } template ostream& operator <<(ostream &os, const vector> &v){ for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os; } template ostream& operator <<(ostream &os, const set &v){ int i=0; for(auto it:v){ if(i > 0){os << ' ';} os << it; i++; } return os; } //1. maskの部分集合を列挙する // a. i==0を評価しない // for(int i=mask; i>0; i=(i-1)&mask) { // } // b. i==0を評価する // for(int i=mask; i>=0; i--) { // i&=mask; // } // 2. maskを含む集合を列挙する // 少し目的は変わりますが同じようなやり方でできる処理が、maskを含む集合の列挙です。 // for(int i=mask; i<(1<>N>>M; vector>costs(N,vector(N,1e7)); for(int i=0;i>a>>b>>c; a--;b--; c=int(1e5)-c; costs[a][b]=min(costs[a][b],c); costs[b][a]=min(costs[b][a],c); } //WHATS(costs) vector>memo(1<(N,int(1e9))); priority_queue,pair>>que; for(int i=0;inextcost){ memo[nextb][ne]=nextcost; que.push(make_pair(make_pair(-cnt-1,-nextcost),make_pair(nextb,ne))); } } } } int answer=-1; for(int i=0;i<(1<