2969-Moocast


本文总阅读量

题目只告诉我们坐标和点权,如何做图的遍历?
对讲机功率大于等于两点之间的距离,才能把消息广播到下一头奶牛,距离在哪?
所以先要解决构图,图构造出来了才能遍历。至于两点之间的距离可以用勾股定理来计算。
距离计算

double dis(int x1, int y1, int x2, int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

构图

for(int i = 1; i <= n; i+++)
	cin>>x[i]>>y[i]>>w[i]; //注意,x和y不是顶点编号,而是坐标,不能用来构图

构图考虑的是顶点与顶点,但这题告诉我们的是坐标,所以我们先要枚举顶点进行构图。

for(int i = 1; i < n; i++)
	for(int j = i+1; j <= n; j++)
		G[i][j]=G[j][i]=dis(x[i],y[i],x[j],y[j]);

注意,G数组也要double类型,否则会有误差,比如传播不到的会传播到(小数尾巴截断后,可能会相等)。
遍历

void dfs(int i)
 {
    cnt++;  //全局变量,记录访问的顶点个数,即奶牛数量
    for(int j = 1; j <= n; j++){
        if(v[j]==0 &&G[i][j]<=w[i]){ //边权小于等于点权,能够广播到
            v[j] = 1;
            dfs(j);
         }
     }
 }

本站总访问量