• [HDOJ2874]Connections between cities(LCA, 离线tarjan)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874

    这题有不连通的情况,特别注意。

    觉得是存query的姿势不对,用前向星存了一遍,还是T……

      1 /*
      2 ━━━━━┒ギリギリ♂ eye!
      3 ┓┏┓┏┓┃キリキリ♂ mind!
      4 ┛┗┛┗┛┃\○/
      5 ┓┏┓┏┓┃ /
      6 ┛┗┛┗┛┃ノ)
      7 ┓┏┓┏┓┃
      8 ┛┗┛┗┛┃
      9 ┓┏┓┏┓┃
     10 ┛┗┛┗┛┃
     11 ┓┏┓┏┓┃
     12 ┛┗┛┗┛┃
     13 ┓┏┓┏┓┃
     14 ┃┃┃┃┃┃
     15 ┻┻┻┻┻┻
     16 */
     17 #include <algorithm>
     18 #include <iostream>
     19 #include <iomanip>
     20 #include <cstring>
     21 #include <climits>
     22 #include <complex>
     23 #include <fstream>
     24 #include <cassert>
     25 #include <cstdio>
     26 #include <bitset>
     27 #include <vector>
     28 #include <deque>
     29 #include <queue>
     30 #include <stack>
     31 #include <ctime>
     32 #include <set>
     33 #include <map>
     34 #include <cmath>
     35 using namespace std;
     36 #define fr first
     37 #define sc second
     38 #define cl clear
     39 #define BUG puts("here!!!")
     40 #define W(a) while(a--)
     41 #define pb(a) push_back(a)
     42 #define Rint(a) scanf("%d", &a)
     43 #define Rll(a) scanf("%lld", &a)
     44 #define Rs(a) scanf("%s", a)
     45 #define Cin(a) cin >> a
     46 #define FRead() freopen("in", "r", stdin)
     47 #define FWrite() freopen("out", "w", stdout)
     48 #define Rep(i, len) for(int i = 0; i < (len); i++)
     49 #define For(i, a, len) for(int i = (a); i < (len); i++)
     50 #define Cls(a) memset((a), 0, sizeof(a))
     51 #define Clr(a, x) memset((a), (x), sizeof(a))
     52 #define Full(a) memset((a), 0x7f7f, sizeof(a))
     53 #define lp p << 1
     54 #define rp p << 1 | 1
     55 #define pi 3.14159265359
     56 #define RT return
     57 #define lowbit(x) x & (-x)
     58 #define onenum(x) __builtin_popcount(x)
     59 typedef long long LL;
     60 typedef long double LD;
     61 typedef unsigned long long ULL;
     62 typedef pair<int, int> pii;
     63 typedef pair<string, int> psi;
     64 typedef map<string, int> msi;
     65 typedef vector<int> vi;
     66 typedef vector<LL> vl;
     67 typedef vector<vl> vvl;
     68 typedef vector<bool> vb;
     69 
     70 typedef struct Query {
     71     int idx;
     72     int u, v;
     73     Query() {}
     74     Query(int uu, int vv, int ii) : u(uu), v(vv), idx(ii) {}
     75 }Query;
     76 
     77 typedef struct Edge {
     78     int u, v, w, idx;
     79     int next;
     80     Edge() {}
     81     Edge(int uu, int vv, int ww) : u(uu), v(vv), w(ww) {}
     82 }Edge;
     83 
     84 typedef struct Ans {
     85     int idx;
     86     int ans;
     87     Ans() {}
     88     Ans(int aa, int ii) :ans(aa), idx(ii) {}
     89 }Ans;
     90 
     91 const int maxn = 20010;
     92 const int maxm = 2000010;
     93 int n, m, c, qcnt;
     94 int depth[maxn];
     95 bool vis[maxn];
     96 int pre[maxn];
     97 Ans ans[maxm];
     98 Edge edge[maxn];
     99 Edge q[maxm];
    100 Query qq[maxm];
    101 int qhead[maxm];
    102 int head[maxn];
    103 int ecnt;
    104 int u, v, w;
    105 
    106 void adde(int u, int v, int w) {
    107     edge[ecnt].u = u;
    108     edge[ecnt].v = v;
    109     edge[ecnt].w = w;
    110     edge[ecnt].next = head[u];
    111     head[u] = ecnt++;
    112 }
    113 
    114 void addq(int u, int v, int i) {
    115     q[qcnt].u = u;
    116     q[qcnt].v = v;
    117     q[qcnt].idx = i;
    118     q[qcnt].next = qhead[u];
    119     qhead[u] = ecnt++;
    120 }
    121 
    122 int find(int x) {
    123     return x == pre[x] ? x : pre[x] = find(pre[x]);
    124 }
    125 
    126 void unite(int x, int y) {
    127     x = find(x);
    128     y = find(y);
    129     if(x != y) pre[y] = x;
    130 }
    131 
    132 void dfs(int u, int p, int d) {
    133     depth[u] = d;
    134     for(int i = head[u]; ~i; i=edge[i].next) {        
    135         int v = edge[i].v;
    136         if(!vis[v] && v != p) {
    137             dfs(v, u, d+edge[i].w);
    138             unite(u, v);
    139         }
    140     }
    141     vis[u] = 1;
    142     for(int i = qhead[u]; ~i; i=q[i].next) {
    143         int uu = q[i].u;
    144         int vv = q[i].v;
    145         int idx = q[i].idx;
    146         if((vis[vv] && uu == u) || (vis[uu] && vv == u)) {
    147             ans[idx].ans = depth[vv] + depth[uu];
    148         }
    149     }
    150 }
    151 
    152 bool cmp(Ans x, Ans y) {
    153     return x.idx < y.idx;
    154 }
    155 
    156 int ufs[maxn];
    157 
    158 int find1(int x) {
    159     return ufs[x] == x ? x : ufs[x] = find1(ufs[x]);
    160 }
    161 
    162 void unite1(int x, int y) {
    163     x = find1(x);
    164     y = find1(y);
    165     if(x != y) ufs[y] = x;
    166 }
    167 
    168 inline bool scan_d(int &num) {
    169     char in;bool IsN=false;
    170     in=getchar();
    171     if(in==EOF) return false;
    172     while(in!='-'&&(in<'0'||in>'9')) in=getchar();
    173     if(in=='-'){ IsN=true;num=0;}
    174     else num=in-'0';
    175     while(in=getchar(),in>='0'&&in<='9'){
    176             num*=10,num+=in-'0';
    177     }
    178     if(IsN) num=-num;
    179     return true;
    180 }
    181 
    182 int main() {
    183     // FRead();
    184     while(~scanf("%d%d%d",&n,&m,&c)) {
    185         Cls(vis); Cls(depth); Cls(ans); Clr(head, -1); Clr(qhead, -1);
    186         qcnt = 0; Rep(i, n+5) pre[i] = i, ufs[i] = i;
    187         Rep(i, m) {
    188             scan_d(u); scan_d(v); scan_d(w);
    189             adde(u, v, w); adde(v, u, w);
    190             unite1(u, v);
    191         }
    192         Rep(i, c) {
    193             scan_d(u); scan_d(v);
    194             addq(u, v, i);
    195             qq[i] = Query(u, v, i);
    196         }
    197         For(i, 1, n+1) if(!vis[i]) dfs(i, -1, 0);
    198         Rep(i, c) {
    199             if(find1(qq[ans[i].idx].u) != find1(qq[ans[i].idx].v)) puts("Not connected");
    200             else printf("%d
    ", ans[i].ans);
    201         }
    202     }
    203     RT 0;
    204 }

    ……TARJAN也T了……

      1 /*
      2 ━━━━━┒ギリギリ♂ eye!
      3 ┓┏┓┏┓┃キリキリ♂ mind!
      4 ┛┗┛┗┛┃\○/
      5 ┓┏┓┏┓┃ /
      6 ┛┗┛┗┛┃ノ)
      7 ┓┏┓┏┓┃
      8 ┛┗┛┗┛┃
      9 ┓┏┓┏┓┃
     10 ┛┗┛┗┛┃
     11 ┓┏┓┏┓┃
     12 ┛┗┛┗┛┃
     13 ┓┏┓┏┓┃
     14 ┃┃┃┃┃┃
     15 ┻┻┻┻┻┻
     16 */
     17 #include <algorithm>
     18 #include <iostream>
     19 #include <iomanip>
     20 #include <cstring>
     21 #include <climits>
     22 #include <complex>
     23 #include <fstream>
     24 #include <cassert>
     25 #include <cstdio>
     26 #include <bitset>
     27 #include <vector>
     28 #include <deque>
     29 #include <queue>
     30 #include <stack>
     31 #include <ctime>
     32 #include <set>
     33 #include <map>
     34 #include <cmath>
     35 using namespace std;
     36 #define fr first
     37 #define sc second
     38 #define cl clear
     39 #define BUG puts("here!!!")
     40 #define W(a) while(a--)
     41 #define pb(a) push_back(a)
     42 #define Rint(a) scanf("%d", &a)
     43 #define Rll(a) scanf("%lld", &a)
     44 #define Rs(a) scanf("%s", a)
     45 #define Cin(a) cin >> a
     46 #define FRead() freopen("in", "r", stdin)
     47 #define FWrite() freopen("out", "w", stdout)
     48 #define Rep(i, len) for(int i = 0; i < (len); i++)
     49 #define For(i, a, len) for(int i = (a); i < (len); i++)
     50 #define Cls(a) memset((a), 0, sizeof(a))
     51 #define Clr(a, x) memset((a), (x), sizeof(a))
     52 #define Full(a) memset((a), 0x7f7f, sizeof(a))
     53 #define lp p << 1
     54 #define rp p << 1 | 1
     55 #define pi 3.14159265359
     56 #define RT return
     57 #define lowbit(x) x & (-x)
     58 #define onenum(x) __builtin_popcount(x)
     59 typedef long long LL;
     60 typedef long double LD;
     61 typedef unsigned long long ULL;
     62 typedef pair<int, int> pii;
     63 typedef pair<string, int> psi;
     64 typedef map<string, int> msi;
     65 typedef vector<int> vi;
     66 typedef vector<LL> vl;
     67 typedef vector<vl> vvl;
     68 typedef vector<bool> vb;
     69 
     70 typedef struct Query {
     71     int idx;
     72     int u, v;
     73     Query() {}
     74     Query(int uu, int vv, int ii) : u(uu), v(vv), idx(ii) {}
     75 }Query;
     76 
     77 typedef struct Edge {
     78     int u, v, w;
     79     int next;
     80     Edge() {}
     81     Edge(int uu, int vv, int ww) : u(uu), v(vv), w(ww) {}
     82 }Edge;
     83 
     84 typedef struct Ans {
     85     int idx;
     86     int ans;
     87     Ans() {}
     88     Ans(int aa, int ii) :ans(aa), idx(ii) {}
     89 }Ans;
     90 
     91 const int maxn = 20010;
     92 const int maxm = 2000010;
     93 int n, m, c, qcnt;
     94 int depth[maxn];
     95 bool vis[maxn];
     96 int pre[maxn];
     97 Query q[maxm];
     98 Ans ans[maxm];
     99 Edge edge[maxn];
    100 int head[maxn];
    101 int ecnt;
    102 int u, v, w;
    103 
    104 void adde(int u, int v, int w) {
    105     edge[ecnt].u = u;
    106     edge[ecnt].v = v;
    107     edge[ecnt].w = w;
    108     edge[ecnt].next = head[u];
    109     head[u] = ecnt++;
    110 }
    111 
    112 int find(int x) {
    113     return x == pre[x] ? x : pre[x] = find(pre[x]);
    114 }
    115 
    116 void unite(int x, int y) {
    117     x = find(x);
    118     y = find(y);
    119     if(x != y) pre[y] = x;
    120 }
    121 
    122 void dfs(int u, int p, int d) {
    123     depth[u] = d;
    124     for(int i = head[u]; ~i; i=edge[i].next) {        
    125         int v = edge[i].v;
    126         if(!vis[v] && v != p) {
    127             dfs(v, u, d+edge[i].w);
    128             unite(u, v);
    129         }
    130     }
    131     vis[u] = 1;
    132     Rep(i, qcnt) {
    133         int uu = q[i].u;
    134         int vv = q[i].v;
    135         int idx = q[i].idx;
    136         if((vis[vv] && uu == u) || (vis[uu] && vv == u)) {
    137             ans[idx].idx = idx;
    138             ans[idx].ans = depth[vv] + depth[uu];
    139         }
    140     }
    141 }
    142 
    143 bool cmp(Ans x, Ans y) {
    144     return x.idx < y.idx;
    145 }
    146 
    147 int ufs[maxn];
    148 
    149 int find1(int x) {
    150     return ufs[x] == x ? x : ufs[x] = find1(ufs[x]);
    151 }
    152 
    153 void unite1(int x, int y) {
    154     x = find1(x);
    155     y = find1(y);
    156     if(x != y) ufs[y] = x;
    157 }
    158 
    159 inline bool scan_d(int &num) {
    160     char in;bool IsN=false;
    161     in=getchar();
    162     if(in==EOF) return false;
    163     while(in!='-'&&(in<'0'||in>'9')) in=getchar();
    164     if(in=='-'){ IsN=true;num=0;}
    165     else num=in-'0';
    166     while(in=getchar(),in>='0'&&in<='9'){
    167             num*=10,num+=in-'0';
    168     }
    169     if(IsN) num=-num;
    170     return true;
    171 }
    172 
    173 int main() {
    174     // FRead();
    175     while(~scanf("%d%d%d",&n,&m,&c)) {
    176         Cls(vis); Cls(depth); Cls(ans); Clr(head, -1);
    177         qcnt = 0; Rep(i, n+5) pre[i] = i, ufs[i] = i;
    178         Rep(i, m) {
    179             scan_d(u); scan_d(v); scan_d(w);
    180             adde(u, v, w); adde(v, u, w);
    181             unite1(u, v);
    182         }
    183         Rep(i, c) {
    184             scan_d(u); scan_d(v);
    185             q[qcnt++] = Query(u, v, i);
    186         }
    187         For(i, 1, n+1) if(!vis[i]) dfs(i, -1, 0);
    188         Rep(i, c) {
    189             if(find1(q[ans[i].idx].u) != find1(q[ans[i].idx].v)) puts("Not connected");
    190             else printf("%d
    ", ans[i].ans);
    191         }
    192     }
    193     RT 0;
    194 }

    在线胡搞T了,等下写个离线的。

    TLE代码:

      1 /*
      2 ━━━━━┒ギリギリ♂ eye!
      3 ┓┏┓┏┓┃キリキリ♂ mind!
      4 ┛┗┛┗┛┃\○/
      5 ┓┏┓┏┓┃ /
      6 ┛┗┛┗┛┃ノ)
      7 ┓┏┓┏┓┃
      8 ┛┗┛┗┛┃
      9 ┓┏┓┏┓┃
     10 ┛┗┛┗┛┃
     11 ┓┏┓┏┓┃
     12 ┛┗┛┗┛┃
     13 ┓┏┓┏┓┃
     14 ┃┃┃┃┃┃
     15 ┻┻┻┻┻┻
     16 */
     17 #include <algorithm>
     18 #include <iostream>
     19 #include <iomanip>
     20 #include <cstring>
     21 #include <climits>
     22 #include <complex>
     23 #include <fstream>
     24 #include <cassert>
     25 #include <cstdio>
     26 #include <bitset>
     27 #include <vector>
     28 #include <deque>
     29 #include <queue>
     30 #include <stack>
     31 #include <ctime>
     32 #include <set>
     33 #include <map>
     34 #include <cmath>
     35 using namespace std;
     36 #define fr first
     37 #define sc second
     38 #define cl clear
     39 #define BUG puts("here!!!")
     40 #define W(a) while(a--)
     41 #define pb(a) push_back(a)
     42 #define Rint(a) scanf("%d", &a)
     43 #define Rll(a) scanf("%I64d", &a)
     44 #define Rs(a) scanf("%s", a)
     45 #define Cin(a) cin >> a
     46 #define FRead() freopen("in", "r", stdin)
     47 #define FWrite() freopen("out", "w", stdout)
     48 #define Rep(i, len) for(int i = 0; i < (len); i++)
     49 #define For(i, a, len) for(int i = (a); i < (len); i++)
     50 #define Cls(a) memset((a), 0, sizeof(a))
     51 #define Clr(a, x) memset((a), (x), sizeof(a))
     52 #define Full(a) memset((a), 0x7f7f, sizeof(a))
     53 #define pi 3.14159265359
     54 #define RT return
     55 #define lowbit(x) x & (-x)
     56 #define onenum(x) __builtin_popcount(x)
     57 typedef long long LL;
     58 typedef long double LD;
     59 typedef unsigned long long ULL;
     60 typedef pair<int, int> pii;
     61 typedef pair<string, int> psi;
     62 typedef map<string, int> msi;
     63 typedef vector<int> vi;
     64 typedef vector<LL> vl;
     65 typedef vector<vl> vvl;
     66 typedef vector<bool> vb;
     67 
     68 typedef struct Edge {
     69     int u, v, w;
     70     int next;
     71 }Edge;
     72 const int maxn = 10010;
     73 const int maxm = 10010;
     74 int n, m, c;
     75 int depth[maxn], fa[maxn];
     76 int pre[maxn];
     77 Edge edge[maxm];
     78 int head[maxn];
     79 int ecnt;
     80 bool vis[maxn];
     81 
     82 void adde(int u, int v, int w) {
     83     edge[ecnt].u = u;
     84     edge[ecnt].v = v;
     85     edge[ecnt].w = w;
     86     edge[ecnt].next = head[u];
     87     head[u] = ecnt++;
     88 }
     89 
     90 int find(int x) {
     91     x == pre[x] ? x : pre[x] = find(pre[x]);
     92 }
     93 
     94 void unite(int x, int y) {
     95     x = find(x);
     96     y = find(y);
     97     if(x != y) pre[y] = x;
     98 }
     99 
    100 void dfs(int u, int p, int d) {
    101     vis[u] = 1;
    102     depth[u] = d; fa[u] = p;
    103     for(int i = head[u]; ~i; i=edge[i].next) {
    104         int v = edge[i].v;
    105         int w = edge[i].w;
    106         if(!vis[v]) dfs(v, u, d+w);
    107     }
    108 }
    109 
    110 int lca(int u, int v) {
    111     int s = 0;
    112     while(depth[u] > depth[v]) {
    113         s += depth[u];
    114         u = pre[u];
    115     }
    116     while(depth[v] > depth[u]) {
    117         s += depth[v];
    118         v = pre[v];
    119     }
    120     while(u != v) {
    121         s += (depth[u] + depth[v]);
    122         u = pre[u];
    123         v = pre[v];
    124     }
    125     return s;
    126 }
    127 
    128 inline bool scan_d(int &num) {
    129     char in;bool IsN=false;
    130     in=getchar();
    131     if(in==EOF) return false;
    132     while(in!='-'&&(in<'0'||in>'9')) in=getchar();
    133     if(in=='-'){ IsN=true;num=0;}
    134     else num=in-'0';
    135     while(in=getchar(),in>='0'&&in<='9'){
    136             num*=10,num+=in-'0';
    137     }
    138     if(IsN) num=-num;
    139     return true;
    140 }
    141 
    142 int main() {
    143     FRead();
    144     int u, v, w;
    145     while(~scanf("%d%d%d",&n,&m,&c)) {
    146         Clr(head, -1); ecnt = 0;
    147         Rep(i, n+5) pre[i] = i;
    148         Rep(i, m) {
    149             scan_d(u); scan_d(v); scan_d(w);
    150             adde(u, v, w); adde(v, u, w);
    151             unite(u, v);
    152         }
    153         For(i, 1, n+1) {
    154             if(!vis[i]) {
    155                 dfs(i, -1, 0);
    156             }
    157         }
    158         W(c) {
    159             scan_d(u); scan_d(v);
    160             if(find(u) != find(v)) puts("Not connected");
    161             else printf("%d
    ", lca(u, v));
    162         }
    163     }
    164     RT 0;
    165 }
  • 相关阅读:
    Android众说纷纭分辨率
    Android初识Helloworld
    Android从零开始
    PHP使用APC获取上传文件进度
    央行mlf,SLF,PSL,MLF,SLO
    python的lxml解析器
    美国风投行业50年数据揭示的10条VC投资秘密法则
    osx的10款文本编辑器
    nano命令,vi ed pico sed joe emacs jed ex
    修改centos7/osx的MAC地址
  • 原文地址:https://www.cnblogs.com/kirai/p/5534539.html
Copyright © 2020-2023  润新知