【搜索/图论】2025-03 DFS染色/二分图

分考场
搜索

#include <bits/stdc++.h>
using namespace std;

int n,m;

int vis[101][101];
int a[101][101];
int ans=100;

void dfs(int ca,int id){
    if(ca>=ans)return;
	if(id>n){
		ans=min(ans,ca);
		return;
	}
	int i,capos;
    for(i=1;i<=ca;i++){
        int capos=1;
        while(a[i][capos]&&!vis[id][a[i][capos]])capos++;
        if(a[i][capos]==0){
            a[i][capos]=id;
            dfs(ca,id+1);
           a[i][capos]=0;
        }
    }
    a[ca+1][1]=id;
    dfs(ca+1,id+1);
    a[ca+1][1]=0;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		vis[a][b]=1;
        vis[b][a]=1;
	}
	dfs(1,1);
	cout<<ans;
	return 0;
}

[**青蛙跳杯子**](https://www.lanqiao.cn/problems/102/learning/)
bfs

include<bits/stdc++.h>

using namespace std;
using ll = long long;
const ll N = 2e5 + 9, inf = 8e18;

//一开始我还寻思着怎么会用到bfs呢,原来和深搜不一样,广搜在做这类模板题时直接跑出了最优解
//需要注意的是题面上是老鼠在跳,其实实际过程中就是杯子和老鼠在交换位置
//这时我们发现其实就只是杯子的位置在遍历搜索,所有广搜直接遍历出最优解返回了
//但map存的就不是我所理解的只会出现一种答案,而是遍历步数的过程
//纯板子题
string a, b;
int n, d[6] = {-1,1,2,-2,3,-3};
map<string,int> mp;//注意每种情况都是一种结果,但是我们广搜直接出了最优解,所以用string标记整个字符串
void bfs()
{
queue q;
q.push(a);
//mp[a] = 0;无需初始化

while(q.size())
{
string ss = q.front();
q.pop();
int cnt = mp[ss];
int x = ss.find('*');//找到杯子的位置
for(int i = 0; i < 6; i ++)
{
int dx = x + d[i];
if(dx >= 0 && dx < n)
{
swap(ss[dx],ss[x]);//破案了,我是个sb,遍历的是队头元素,对队头元素进行操作

if(!mp.count(ss))
{
mp[ss] = cnt + 1;
if(ss == b)
{
cout << mp[ss] << '\n';
return;
}
q.push(ss);//入队此种情况后,再进行还原,保证走的每一步都入队,方便后续入队
}
swap(ss[dx],ss[x]);
}
}
}
}

void solve()
{
cin >> a >> b;
n = a.size();
bfs();
}

int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _= 1;
//cin >> ;
while(
--)
{
solve();
}
return 0;
}

posted @ 2025-03-05 20:33  冬天的睡袋  阅读(25)  评论(0)    收藏  举报