RT,很飞舞的小蒟蒻写的抱灵代码
在魔塔中有N个房间和M条道路,每条道路上有一个怪,它可以被一种特殊的武器消灭,而每个房间中也存在一种武器。现在知道第I个房间中的武器编号为I,小明(主人翁)初始在J房间,小明想知道哪些房间是他可以去的。
第一行是N,J,M,接下来M行每行三个数Ai,Bi,Ci,分别代表Ai房间和Bi房间之间有路,且此处的怪物可以被Ci号武器消灭。
N行,如果I个房间可以到达,则在第I行输出Yes,否则输出No。
6 4 6
1 2 1
1 3 2
2 4 4
3 4 4
3 5 3
5 6 6
1:Yes
2:Yes
3:Yes
4:Yes
5:Yes
6:No
时间限制:所有句子相加不超过1亿句。 1亿就是1秒
空间限制:所有数组相加不超过1000万。 约40M内存
数据范围 1<=m<=50000,1<=a,b,J<=n<=50000 提示:m,n<50000不等于说数组可以只开到50000;输出前面无空格
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct aaa{
int f,t,s,l;
}o;
int n,m,s,l[50005];
vector<vector<aaa> >v(50005);
void dfs(int x){
l[x]=1;
for(int i=0;i<=v[x].size()-1;i++){
if(v[x][i].l) continue;
if(l[v[x][i].s]) v[x][i].l=1,dfs(v[x][i].t);
}
}
signed main(){
cin>>n>>s>>m;
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&o.f,&o.t,&o.s);
o.l=0,v[o.f].push_back(o),swap(o.f,o.t),v[o.f].push_back(o);
}
dfs(s);
for(int i=1;i<=n;i++){
printf("%lld",i);
if(l[i]) printf(":YES\n");
else printf(":NO\n");
}
}
这题是广搜吧?(雾