7720-Wand


本文总阅读量

图的遍历,因为事先知道决斗结果,即x能赢y,这种关系都可以用图论中的来表示。因为两个巫师决斗,一个赢一个输,所以应该看成有向图:输->赢,这样魔杖才会移动。
如何判断一个巫师能不能拿到魔杖,只要看从1出发能不能访问到他。至于从他出发访问其他点(输),可以先进行决斗(题意说决斗顺序可以任意选择),那时候他手上还没有魔杖,输给别人也不会影响他最后拿到魔杖。
所以,从顶点1出发进行图的遍历,能否访问到的顶点都能拿到魔杖。
这样结束了?题目可没说每个人都会参与决斗,万一1号巫师没有跟别人决斗过呢?只有把这点也考虑进去,这题才算分析完。可以设一个变量tag,用来记录有没有遍历其他顶点,只要遍历了,记为1
顶点最多有105,所以不能使用邻接矩阵,只能用邻接表。

构图(储存)

	for(int i = 1,x,y; i <= m; i++){
		cin>>x>>y;
		G[y].push_back(x);
	}

图的遍历(深搜)

void dfs(int x)
{
	for(auto y:G[x]){  //遍历与x相连的顶点
		if(vis[y]==0){
			vis[y] = 1;
			tag = 1;
			dfs(y);
		}
	}
	
}

本站总访问量