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 }