①能否到达
②有无负环(回到过去)
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 10006;
const int inf = 0x3f3f3f3f;
struct node
{
int u, v, w, next;
}e[N];
int cnt;
int head[N], vis[N], dis[N], num[N];
void add(int u, int v, int w)
{
e[cnt].u = u;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt++;
}
bool spfa(int s, int n)
{
queue<int> q;
int i;
for(i = 1; i < N; ++i)
dis[i] = inf;
q.push(s);
dis[s] = 0;
vis[s] = 1;
num[s]++;
while(!q.empty())
{
int x = q.front();
q.pop();
vis[x] = 0;
for(i = head[x]; ~i; i = e[i].next)
{
int vv = e[i].v;
if(dis[vv] > dis[e[i].u] + e[i].w)
{
dis[vv] = dis[e[i].u] + e[i].w;
if(!vis[vv])
{
vis[vv] = 1;
q.push(vv);
++num[vv];
if(num[vv] > n)
return 0;
}
}
}
}
return 1;
}
int main()
{
int m, u, v, w, n;
while(~scanf("%d%d", &m, &n))
{
cnt = 0;
memset(head, -1, sizeof head);
memset(vis, 0, sizeof vis);
memset(e, 0, sizeof e);
memset(num, 0, sizeof num);
while(m--)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
if(!spfa(1, n) || dis[n] == inf)
printf("IMPOSSIBLE!\n");
else
printf("%d\n", dis[n]);
}
return 0;
}