cf#286-B - Mr. Kitayuta's Colorful Graph-dfs

给你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; 
}  


你可能感兴趣的:(cf#286-B - Mr. Kitayuta's Colorful Graph-dfs)