1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <cmath> #include <cstdio> #include <map>
using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) #define PI acos(-1) #define DEBUG(a) cout << (a) << endl typedef long long ll; int dir8[8][2] = {{1, 2}, {2, 1}, {-1, 2}, {2, -1}, {-2, 1}, {-2, -1}, {-1, -2}, {1, -2}}; int dir4[4][2] = {1, 0, 0, 1, -1, 0, 0, -1}; const int INF = 0x3f3f3f3fLL; const long long LLF = 0x3f3f3f3f3f3f3f3fLL; const int MAXn = 4e4 + 15; const int mod = 1e9 + 7;
struct node { int u, v, w, next; } edge[2 * MAXn]; struct Quiz { int u, v, i, next; } quiz[2*205]; int head_edge[MAXn]; int head_quiz[MAXn]; bool vis[MAXn]; int dis[MAXn]; int fa[MAXn]; int lca[205]; int A[205],B[205]; int n, m, tot1 = 0, tot2 = 0;
void add_edge(int u, int v, int w){ edge[++tot1] = {u, v, w, head_edge[u]}; head_edge[u] = tot1; } void add_quiz(int u,int v,int i){ quiz[++tot2]={u,v,i,head_quiz[u]}; head_quiz[u]=tot2; } void init(){ mem(dis, 0); mem(vis, 0); mem(head_edge, 0); mem(head_quiz,0); tot1 = tot2 = 0; } int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void Tarjan(int x){ vis[x]=1; fa[x]=x; for(int i=head_quiz[x];i!=0;i=quiz[i].next){ if(vis[quiz[i].v]) lca[quiz[i].i]=find(quiz[i].v); } for(int i=head_edge[x];i!=0;i=edge[i].next){ if(!vis[edge[i].v]){ dis[edge[i].v]=dis[x]+edge[i].w; Tarjan(edge[i].v); fa[edge[i].v]=x; } } }
|