给你n个点,m个边的图,每条边边权代表一种颜色
q次询问
询问【a,b】边 是否能通过 单一颜色 的一条或多条边连接起来,输出 这样的颜色数量
dfs判断 每次进入下一层递归的条件是 与上一次选的边颜色一样。。
AC代码:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <stack> #include <map> #include <vector> using namespace std; const int inf =2147483640; const double eps=0.000001; struct node { int x,col; node(){} node(int a,int b){x=a;col=b;} } ; int a[105],b[105],c[105]; vector <node > mp[105]; int color[105]; int n,m; int vis[105]; int dfs(int x,int y,int col) { vis[x]=1; //标记是已经走过此点,再走一次无意义且会死循环 int ans=0; int i; for (i=0;i<mp[x].size();i++) { if (col!=mp[x][i].col&&col!=-1) continue; //颜色与之前选定的路颜色不一致 //以下是颜色一致的情况 if (mp[x][i].x==y) //如果遇到终点 { color[mp[x][i].col]=1; //标记该颜色为合法答案 } else //其余点则递归进入 { if (vis[mp[x][i].x]) continue; //如果访问过则不再访问 dfs(mp[x][i].x,y,mp[x][i].col); } } vis[x]=0; //删除标记 return 0; } int main() { scanf("%d%d",&n,&m); int i; for (i=1;i<=m;i++) { scanf("%d %d %d",&a[i],&b[i],&c[i]); mp[a[i]].push_back(node(b[i],c[i])); mp[b[i]].push_back(node(a[i],c[i])); } int qa,qb; int q; scanf("%d",&q); for (i=1;i<=q;i++) { memset(color,0,sizeof(color)); scanf("%d%d",&qa,&qb); dfs(qa,qb,-1); //-1表示任何颜色都是合法的 int ans=0; for (int j=1;j<=m;j++) if (color[j]) ans++; //计算多少个合法颜色 printf("%d\n",ans); } return 0; }