[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\n", 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\n", 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\n", lca(u, v));
162         }
163     }
164     RT 0;
165 }

 

posted @ 2016-05-27 14:30  Kirai  阅读(183)  评论(0编辑  收藏  举报