Pagini recente » Borderou de evaluare (job #2867632) | Cod sursa (job #1933518)
# include <bits/stdc++.h>
# define maxn 100001
# define ll long long
# define clock (clock() * 1000.0 / CLOCKS_PER_SEC)
# define rc(s) return cout << s,0
# define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
# define pb push_back
# define mp make_pair
//# define int ll
using namespace std;
const int inf = (1e9);
inline int readChar();
template <class T = int> inline T readInt();
template <class T> inline void writeInt( T x, char end = 0 );
inline void writeChar( int x );
inline void writeWord( const char *s );
/** Read */
static const int buf_size = 4096;
inline int getChar() {
static char buf[buf_size];
static int len = 0, pos = 0;
if (pos == len)
pos = 0, len = fread(buf, 1, buf_size, stdin);
if (pos == len)
return -1;
return buf[pos++];
}
inline int readChar() {
int c = getChar();
while (c <= 32)
c = getChar();
return c;
}
template <class T>
inline T readInt() {
int s = 1, c = readChar();
T x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
inline ll readLong() {
int s = 1, c = readChar();
ll x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
/** Write */
static int write_pos = 0;
static char write_buf[buf_size];
inline void writeChar( int x ) {
if (write_pos == buf_size)
fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;
write_buf[write_pos++] = x;
}
template <class T>
inline void writeInt( T x, char end ) {
if (x < 0)
writeChar('-'), x = -x;
char s[24];
int n = 0;
while (x || !n)
s[n++] = '0' + x % 10, x /= 10;
while (n--)
writeChar(s[n]);
if (end)
writeChar(end);
}
inline void writeWord( const char *s ) {
while (*s)
writeChar(*s++);
}
struct Flusher {
~Flusher() {
if (write_pos)
fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;
}
} flusher;
vector<pair<int,int>>vec[18];
int dp[(1 << 19)][18];
int n,m,x,y,cst;
int mn;
int32_t main(){_
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
n = readInt();
m = readInt();
while(m --)
{
x = readInt();
y = readInt();
cst = readInt();
vec[y].pb(mp(x,cst));
}
for(int i = 0;i < (1 << n);i++)
for(int j = 0;j < n;j++)
dp[i][j] = inf;
dp[1][0] = 0;
for(int mask = 0;mask < (1 << n);mask++)
{
for(int lst = 0;lst < n;lst ++)
{
for(auto it : vec[lst])
{
if(mask & (1 << it.first))
dp[mask][lst] = min(dp[mask][lst],dp[mask ^ (1 << lst)][it.first] + it.second);
}
}
}
mn = inf;
for(auto it : vec[0])
{
mn = min(mn,dp[(1 << n) - 1][it.first] + it.second);
}
if(mn < inf) writeInt(mn);
else writeWord("Nu exista solutie");
}