摘要
题意
图,边有颜色,问任意两点之间直接或间接连边的颜色(要求都是同色)。
题解
代码
505B.cpp代码已折叠
展开折叠内容
|
- #include <iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<cstdlib>
- #include<climits>
- #include<queue>
- #include<vector>
- #define f(i,n) for(int i=1;i<=n;++i)
- #define fi(i,t,n)for(int i=t;i<=n;++i)
- #define fd(i,n) for(int i=n;i>=1;--i)
- #define fdi(i,t,n) for(int i=n;i>=t;--i)
- #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
- #define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
- #define si(n) scanf("%d",&n)
- #define dsi(n) int n;scanf("%d",&n)
- #define llu unsigned long long
- #define lld long long
- #define ci const int &
- using namespace std;
- int f[1000][1000]={},maxC=0;
- int getF(ci x,ci color)
- {
- return (f[color][x]==x)?x:f[color][x]=getF(f[color][x],color);
- }
- void link(ci a,ci b,ci color)
- {
- maxC=max(color,maxC);
- f[color][getF(a,color)]=getF(b,color);
- }
- bool isLink(ci a,ci b,ci color)
- {
- return getF(a,color)==getF(b,color);
- }
- int getColor(ci a,ci b)
- {
- int ret=0;
- for(int i=1;i<=maxC;++i)
- if(isLink(a,b,i))
- ++ret;
- return ret;
- }
- int main()
- {
- dsi(n);
- f(i,101)f(j,101)f[i][j]=j;
- dsi(m);
- f(i,m)
- {
- dsi(a);dsi(b);dsi(c);
- link(a,b,c);
- }
- si(m);
- f(i,m)
- {
- dsi(a);dsi(b);
- printf("%d\n",getColor(a,b));
- }
- }
|