dfs那里很妙:队列i和local成对子,一起pop后要继续搜loca,因为i在退出dfs后会继续在while里判断,如果还有又进dfs;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double
//======================
const int N=2e5+10;
queue<int>q[N];
int vis[N];
unordered_map<int,int>mp;
void dfs(int i) //第i个的头出现过
{
int loca=mp[q[i].front()];
// vis[q[i].front()]=0;
q[loca].pop();
q[i].pop();
while(q[loca].size()&&vis[q[loca].front()])//pop完之后又有对子
{
dfs(loca);
}
if(q[loca].size())
{
vis[q[loca].front()]=1;
mp[q[loca].front()]=loca;
}
}
int main()
{
int n,m;cin>>n>>m;
for(int i=0;i<m;i++)
{
int k;cin>>k;
for(int j=0;j<k;j++)
{
int t;cin>>t;q[i].push(t);
}
}
for(int i=0;i<m;i++)
{
while(q[i].size()&&vis[q[i].front()])//有而且找到了
{
dfs(i);
}
if(q[i].size())
{
vis[q[i].front()]=1;
mp[q[i].front()]=i;
}
}
int flag=1;
for(int i=0;i<m;i++)
{
if(q[i].size())
{
flag=0;break;
}
}
if(flag) cout<<"Yes";
else cout<<"No";
return 0;
}
本文解析了如何通过队列i与局部变量loca的配合,优化DFS遍历过程中的队列操作。重点在于理解当i节点退出dfs后,如何利用while循环检测并处理loca的剩余对子。

463

被折叠的 条评论
为什么被折叠?



