P1186 Marika elimina el borde y busca el camino más largo más corto

Significado del tema: Para resumir: elimine el borde en cualquier ruta más corta y luego encuentre la ruta más corta más grande

Idea: 0.0

1 #include <bits / stdc ++. H>
 2  usando el  espacio de nombres std;
3  const  int inf = 0x3f3f3f3f ;
4  const  int maxn = 1e3 + 10 ;
5  int vis [maxn]; int dis [maxn];
6  int corte [maxn] [maxn];
7  int partido [maxn];
8  struct node
 9  {
 10      int v, w, nxt;
11 } G [ 1000010 ]; int cabeza [maxn]; int num;
12 void add ( int u, int v, int w)
 13  {
 14      G [++ num] .v = v; G [num] .w = w; G [num] .nxt = head [u]; head [u ] = num;
15  }
 16  nulo SPFA1 ()
 17  {
 18      cola < int > q;
19      memset (dis, inf, sizeof (dis));
20      memset (vis, 0 , sizeof (vis));
21      q.push ( 1 );
22      vis [ 1 ] = 1 ;
23     dis [ 1 ] = 0 ;
24      while (! Q.empty ()) {
 25          int u = q.front ();
26          q.pop ();
27          vis [u] = 0 ;
28          para ( int i = cabeza [u]; i; i = G [i] .nxt) {
 29              int v = G [i] .v, w = G [i] .w;
30              if (dis [v]> dis [u] + w) {
 31                  dis [v] = dis [u] + w;
32                  coincidencias [v] = u;
33                  if (! Vis [v]) {
 34                     q.push (v);
35                      vis [v] = 1 ;
36                  }
 37              }
 38          }
 39      }
 40  }
 41  nulo SPFA2 ()
 42  {
 43      cola < int > q;
44      memset (dis, inf, sizeof (dis));
45      memset (vis, 0 , sizeof (vis));
46      q.push ( 1 );
47      vis [ 1 ] = 1 ;
48      dis [ 1 ] = 0 ;
49      while (! Q.empty ()) {
 50          int u = q.front ();
51          q.pop ();
52          vis [u] = 0 ;
53          para ( int i = cabeza [u]; i; i = G [i] .nxt) {
 54              int v = G [i] .v, w = G [i] .w;
55              if (corte [u] [v]) continuar ;
56              if (dis [v]> dis [u] + w) {
 57                  dis [v] = dis [u] + w;
58                  if (! Vis [v]) {
59                      q.push (v);
60                      vis [v] = 1 ;
61                  }
 62              }
 63          }
 64      }
 65  }
 66  int main ()
 67  {
 68      int n, m;
69      scanf ( " % d% d " , & n, & m);
70      para ( int i = 1 ; i <= m; i ++ ) {
 71          int u, v, w;
72          scanf ( " % d% d% d ", & u, & v, & w);
73          agregar (u, v, w);
74          add (v, u, w);
75      }
 76      SPFA1 ();
77      int ahora = n;
78      int ans = dis [n];
79      while (partido [ahora]) {
 80          int u = ahora; int v = partido [ahora];
81          corte [u] [v] = corte [v] [u] = 1 ;
82          SPFA2 ();
83          corte [u] [v] = corte [v] [u] = 0 ;
84          ans = max (ans, dis [n]);
85          ahora =partido [ahora];
86      }
 87      printf ( " % d \ n " , ans);
88      devuelve  0 ;
89 }
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/pangbi/p/12722428.html
Recomendado
Clasificación