//Accepted 4688 KB 63 ms #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; const int imax_e = imax_n*imax_n; ; int head[imax_n]; int next[imax_e]; struct node { int u,v,c; node() { } node(int u,int v,int c):u(u),v(v),c(c) { } }p[imax_e]; int e; void init() { memset(head,-,sizeof(head)); memset(next,-,sizeof(next)); e=; } void addEdge(int u,int v,int c) { p[e]=node(u,v,c); next[e]=head[u]; head[u]=e++; } int dis[imax_n]; bool vis[imax_n]; int cnt[imax_n]; int n,m; queue<int > q; bool relax(int u,int v,int c) { if (dis[v]>dis[u]+c) { dis[v]=dis[u]+c; return true; } return false; } bool spfa(int src) { while (!q.empty()) q.pop(); memset(vis,false,sizeof(vis)); memset(cnt,,sizeof(cnt)); ;i<=n;i++) dis[i]=inf; dis[src]=; q.push(src); vis[src]=true; while (!q.empty()) { int pre=q.front(); q.pop(); vis[pre]=false; ;i=next[i]) { if (relax(pre,p[i].v,p[i].c) && !vis[p[i].v]) { if ((++cnt[p[i].v])>n) return false; q.push(p[i].v); vis[p[i].v]=true; } } } return true; } int main() { while (scanf("%d%d",&m,&n)!=EOF) { init(); int u,v,c; ;i<m;i++) { scanf("%d%d%d",&u,&v,&c); addEdge(u,v,c); addEdge(v,u,c); } spfa(n); printf(]); } ; }