2019牛客暑期多校训练营(第四场)

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=1000100;
 5 const int M=9e6+10;
 6 struct node
 7 {
 8     int next,to,w;
 9 } e[M];
10 int h[N],v[N],d[N],tot;
11  
12 int n,m,s,t,k,ans;
13 void add(int u,int v,int w){
14     tot++;
15     e[tot].to=v;
16     e[tot].w=w;
17     e[tot].next=h[u];
18     h[u]=tot;
19 }
20  
21 priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
22 void dij(int s){
23     memset(d,0x3f3f3f3f,sizeof(d));
24     d[s]=0;
25     q.push(make_pair(0,s));
26     while (!q.empty()){
27         int u=q.top().second;
28         q.pop();
29         if (v[u]){
30             continue;
31         }
32         v[u]=1;
33         for (int i=h[u];i;i=e[i].next){
34             int to=e[i].to;
35             if (d[to]>d[u]+e[i].w){
36                 d[to]=d[u]+e[i].w;
37                 q.push(make_pair(d[to],to));
38             }
39         }
40     }
41 }
42 int main()
43 {
44     scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
45     for (int i=1; i<=m; i++)
46     {
47         int u,v,w;
48         scanf("%d%d%d",&u,&v,&w);
49         add(u,v,w);
50         add(v,u,w);
51         for (int j=1; j<=k; j++)
52         {
53             add(u+n*(j-1),v+j*n,0);
54             add(v+n*(j-1),u+j*n,0);
55             add(u+n*j,v+j*n,w);
56             add(v+n*j,u+j*n,w);
57         }
58     }
59     dij(s);
60     ans=0x3f3f3f3f;
61     for (int i=0;i<=k;i++){
62         ans=min(ans,d[k*n+t]);
63     }
64     printf("%d\n",ans);
65     return 0;
66 }
View Code

 1 #include<bits/stdc++.h>
 2 const int N=1e5+10;
 3 using namespace std;
 4 struct node{
 5     int t,n;
 6 }e[N*2];
 7 int n,m,k,kk;
 8 int d[N],a[N],h[N],t;
 9 
10 void add(int u,int v){
11     t++;
12     e[t].t=v;
13     e[t].n=h[u];
14     h[u]=t;
15 }
16 void bfs(int x) {
17     memset(d, 0, sizeof(d));
18     d[x] = 1;
19     queue<int> q;
20     q.push(x);
21     while (!q.empty()) {
22         int u = q.front();
23         q.pop();
24         for (int i = h[u]; i; i = e[i].n) {
25             int v = e[i].t;
26             if (!d[v]) {
27                 d[v] = d[u] + 1;
28                 q.push(v);
29             }
30         }
31     }
32 }
33 int main(){
34     scanf("%d%d",&n,&m);
35     for (int i=1;i<n;i++){
36         int u,v;
37         scanf("%d%d",&u,&v);
38         add(u,v);
39         add(v,u);
40     }
41     for (int i=1;i<=m;i++){
42         scanf("%d",&a[i]);
43     }
44     bfs(a[1]);
45     for (int i=1;i<=m;i++){
46         if (d[a[i]]>k){
47             k=d[a[i]];
48             kk=a[i];
49         }
50     }
51     bfs(kk);
52     k=0;
53     kk=0;
54     for (int i=1;i<=m;i++){
55         if (d[a[i]]>k){
56             k=d[a[i]];
57             kk=a[i];
58         }
59     }
60     printf("%d\n",k/2);
61 }
View Code

猜你喜欢

转载自www.cnblogs.com/Accpted/p/11256192.html