标签:
1 /*
2 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条
3 DFS:暴力每个颜色,以u走到v为结束标志,累加条数
4 注意:无向图
5 */
6 #include <cstdio>
7 #include <iostream>
8 #include <algorithm>
9 #include <cstring>
10 #include <string>
11 #include <vector>
12 using namespace std;
13
14 const int MAXN = 1e2 + 10;
15 const int INF = 0x3f3f3f3f;
16 int n, m;
17 bool vis[MAXN];
18 vector<pair<int, int> > V[MAXN];
19
20 bool DFS(int u, int v, int c)
21 {
22 vis[u] = true;
23 if (u == v) return true;
24 for (int i=0; i<V[u].size (); ++i)
25 {
26 pair<int, int> p = V[u][i];
27 if (p.second == c && !vis[p.first])
28 {
29 if (DFS (p.first, v, c)) return true;
30 }
31 }
32
33 return false;
34 }
35
36 int main(void) //Codeforces Round #286 (Div. 2) B - Mr. Kitayuta‘s Colorful Graph
37 {
38 //freopen ("B.in", "r", stdin);
39
40 while (scanf ("%d%d", &n, &m) == 2)
41 {
42 for (int i=1; i<=m; ++i)
43 {
44 int u, v, c;
45 scanf ("%d%d%d", &u, &v, &c);
46 V[u].push_back (make_pair (v, c));
47 V[v].push_back (make_pair (u, c));
48 }
49 int q; scanf ("%d", &q);
50 while (q--)
51 {
52 int u, v; scanf ("%d%d", &u, &v);
53 int ans = 0;
54 for (int i=1; i<=m; ++i)
55 {
56 memset (vis, false, sizeof (vis));
57 if (DFS (u, v, i)) ans++;
58 }
59 printf ("%d\n", ans);
60 }
61 }
62
63 return 0;
64 }
1 /*
2 并查集:开在结构体的并查集,进行如下的两个操作
3 uf[c].Union (u, v); uf[i].same (u, v)
4 */
5 #include <cstdio>
6 #include <iostream>
7 #include <algorithm>
8 #include <cstring>
9 #include <vector>
10 using namespace std;
11
12 const int MAXN = 1e2 + 10;
13 const int INF = 0x3f3f3f3f;
14 struct UF
15 {
16 int rt[MAXN];
17 void init(void) {memset (rt, -1, sizeof (rt));}
18
19 int Find(int x) {return (rt[x] == -1) ? x : rt[x] = Find (rt[x]);}
20
21 void Union(int x, int y)
22 {
23 int tx = Find (x);
24 int ty = Find (y);
25 if (tx > ty) rt[ty] = tx;
26 else if (tx < ty) rt[tx] = ty;
27 }
28
29 bool same(int x, int y)
30 {
31 return (Find (x) == Find (y));
32 }
33 }uf[MAXN];
34 int n, m;
35
36 int main(void) //Codeforces Round #286 (Div. 2) B - Mr. Kitayuta‘s Colorful Graph
37 {
38 //freopen ("B.in", "r", stdin);
39
40 while (scanf ("%d%d", &n, &m) == 2)
41 {
42 for (int i=1; i<=m; ++i) uf[i].init ();
43 for (int i=1; i<=m; ++i)
44 {
45 int u, v, c;
46 scanf ("%d%d%d", &u, &v, &c);
47 uf[c].Union (u, v);
48 }
49 int q; scanf ("%d", &q);
50 while (q--)
51 {
52 int u, v; scanf ("%d%d", &u, &v);
53 int ans = 0;
54 for (int i=1; i<=m; ++i)
55 {
56 if (uf[i].same (u, v)) ans++;
57 }
58 printf ("%d\n", ans);
59 }
60 }
61
62 return 0;
63 }
DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph
标签:
原文地址:http://www.cnblogs.com/Running-Time/p/4512405.html