// Change of Scenery
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #include <vector>
6 #include <utility>
7 #include <queue>
8 using namespace std;
9 typedef long long ll;
10 typedef pair<int,int>P;
11 int n,m,k;
12 const int N=10010;
13 const ll inf=1e10+9;
14 const ll mod=1e9+7;
15 struct Node{
16 int to;
17 ll w;
18 Node(){}
19 Node(int TO,ll W){
20 to=TO;
21 w=W;
22 }
23 };
24 vector<Node>vec[N];
25 int prenum[N];
26 ll dis[N];
27 void bfs(int sta){
28 priority_queue<P,vector<P>,greater<P> >que;
29 dis[sta]=0;
30 prenum[sta]=1;
31 que.push(P(0,sta));
32 while(!que.empty())
33 {
34 P q=que.top();
35 que.pop();
36 int v=q.second;
37 if(dis[v]<q.first) continue;
38 for(int i=0;i<vec[v].size();i++){
39 Node Nod=vec[v][i];
40 int t=Nod.to;
41 if(dis[t]>dis[v]+Nod.w){
42 dis[t]=dis[v]+Nod.w;
43 prenum[t]=prenum[v];
44 que.push(P(dis[t],t));
45 }
46 else if(dis[t]==dis[v]+Nod.w){
47 prenum[t]=(prenum[t]+prenum[v])%mod;//关键点
48 //本题的路径数目可能很多,long long 也不一定满足,因为路径数目用的是
49 //乘法原理,因此要取余
50 }
51 }
52 }
53 }
54 int main()
55 {
56 scanf("%d%d%d",&n,&m,&k);
57 int xx;
58 for(int i=0;i<k;i++){
59 scanf("%d",&xx);
60 }
61 int x,y;
62 ll z;
63 for(int i=0;i<m;i++){
64 scanf("%d%d%lld",&x,&y,&z);
65 vec[x].push_back(Node(y,z));
66 vec[y].push_back(Node(x,z));//这是个无向图
67 }
68 for(int i=1;i<=n;i++)
69 dis[i]=inf;
70 bfs(1);
71 if(prenum[n]<2){
72 printf("no\n");
73 return 0;
74 }
75 else{
76 printf("yes\n");
77 }
78 return 0;
79 }
1 // German Collegiate Programming Contest 2015 计蒜课 Change of Scenery
2 #include <iostream>
3 #include <cstdio>
4 #include <algorithm>
5 #include <cstring>
6 #include <vector>
7 #include <utility>
8 #include <queue>
9 using namespace std;
10 typedef long long ll;
11 typedef pair<int,int>P;
12 int n,m,k;
13 const int N=10010;
14 const ll inf=1e10+9;
15 const ll mod=1e9+7;
16 struct Node{
17 int to;
18 ll w;
19 Node(){}
20 Node(int TO,ll W){
21 to=TO;
22 w=W;
23 }
24 };
25 vector<Node>vec[N];
26 int prenum[N];
27 ll dis[N];
28 void bfs(int sta){
29 priority_queue<P,vector<P>,greater<P> >que;
30 dis[sta]=0;
31 prenum[sta]=1;
32 que.push(P(0,sta));
33 while(!que.empty())
34 {
35 P q=que.top();
36 que.pop();
37 int v=q.second;
38 if(dis[v]<q.first) continue;
39 for(int i=0;i<vec[v].size();i++){
40 Node Nod=vec[v][i];
41 int t=Nod.to;
42 if(dis[t]>dis[v]+Nod.w){
43 dis[t]=dis[v]+Nod.w;
44 prenum[t]=prenum[v];
45 que.push(P(dis[t],t));
46 }
47 else if(dis[t]==dis[v]+Nod.w){
48 prenum[t]=(prenum[t]+prenum[v])%mod;//关键点
49 //本题的路径数目可能很多,long long 也不一定满足,因为路径数目用的是
50 //乘法原理,因此要取余
51 }
52 }
53 }
54 }
55 int main()
56 {
57 scanf("%d%d%d",&n,&m,&k);
58 int xx;
59 for(int i=0;i<k;i++){
60 scanf("%d",&xx);
61 }
62 int x,y;
63 ll z;
64 for(int i=0;i<m;i++){
65 scanf("%d%d%lld",&x,&y,&z);
66 vec[x].push_back(Node(y,z));
67 vec[y].push_back(Node(x,z));//这是个无向图
68 }
69 for(int i=1;i<=n;i++)
70 dis[i]=inf;
71 bfs(1);
72 if(prenum[n]<2){
73 printf("no\n");
74 return 0;
75 }
76 else{
77 printf("yes\n");
78 }
79 return 0;
80 }