模板1——搜索+图论

DFS

PID:P1706

//P1706 全排列问题
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,f[101],a[101];
void dfs(int k){
	if(k>n){
		for(int i=1;i<=n;i++)
			cout<<setw(5)<<a[i];
		cout<<"\n";
		return;
	}
	else{
		for(int i=1;i<=n;i++){//搜索范围 
			if(f[i]==1)continue;
			f[i]=1;
			a[k]=i;//选取i放到盒子中 
			dfs(k+1);//占用标记 
			f[i]=0;//下个位置继续搜 
		}
	}
}
signed main(){
	cin>>n;
	dfs(1);
	return 0;
}

BFS

PID:P1443

//P1443 马的遍历
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,y,v[450][450];
int pos[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
queue<pair<int,int> >q;
void push(int x1,int y11,int k){
	if(x1<1||y11<1||x1>n||y11>m) return ;
	if(v[x1][y11]!=-1) return ;
	v[x1][y11]=k;
	q.push({x1,y11});
}
void bfs(){
	memset(v,-1,sizeof(v));
	push(x,y,0);
	while(!q.empty()){
		pair<int,int> t=q.front();
		q.pop();
		int xx=t.first;
		int yy=t.second;
		for(int i=0;i<8;i++){
			push(xx+pos[i][0],yy+pos[i][1],v[xx][yy]+1);
		}
	}
}
signed main(){
	cin>>n>>m>>x>>y;
	bfs();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) cout<<v[i][j]<<" ";
		cout<<"\n";
	}
	return 0;
}

Dijkstra

PID:P4779

//P4779 【模板】单源最短路径(标准版)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6,INF=INT_MAX;
int n,m,s,dis[N],vis[N];
vector<pair<int,int>>g[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
void dij(){
	for(int i=1;i<=n;i++) dis[i]=INF;
	dis[s]=0;
	q.push({0,s});
	while(!q.empty()){
		int mi=q.top().second;
		q.pop();
		if(vis[mi]) continue;
		vis[mi]=1;
		for(auto u:g[mi]){
			int v=u.first;
			int w=u.second;
			if(dis[v]>dis[mi]+w){
				dis[v]=dis[mi]+w;
				q.push({dis[v],v});
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1,u,v,w;i<=m;i++){
		cin>>u>>v>>w;
		g[u].push_back({v,w});
	}
	dij();
	for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
	return 0;
}

Spfa

PID:P3385

//P3385 【模板】负环
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2010,INF=0x3f3f3f3f;
int T,n,m,dis[N],cnt[N],in[N];
vector<pair<int,int> > g[N];
bool spfa(){
	queue<int> q;
	for(int i=1;i<=n;i++) dis[i]=INF,cnt[i]=0,in[i]=0;
	dis[1]=0;
	q.push(1),in[1]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		in[u]=0;
		for(auto t:g[u]){
			int v=t.first,w=t.second;
			if(dis[u]+w<dis[v]){
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n) return 1;
				dis[v]=dis[u]+w;
				if(in[v]==0){
					q.push(v);
					in[v]=1;
				}
			}
		}
	}
	return 0;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++) g[i].clear();
		for(int i=1,u,v,w;i<=m;i++){
			cin>>u>>v>>w;
			g[u].push_back({v,w});
			if(w>=0) g[v].push_back({u,w});
		}
		if(spfa()) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

Bellman_ford

PID:P3385

//P3385 【模板】负环
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2010,INF=0x3f3f3f3f;
int T,n,m,dis[N];
vector<pair<int,int> > g[N];
bool bf(){
	for(int i=1;i<=n;i++) dis[i]=INF;
	dis[1]=0;
	int flg=0;
	for(int i=1;i<=n;i++){
		flg=0;
		for(int u=1;u<=n;u++){
			if(dis[u]==INF) continue;
			for(auto t:g[u]){
				int v=t.first,w=t.second;
				if(dis[u]+w<dis[v]) dis[v]=dis[u]+w,flg=1;
			}
		}
		if(!flg) return 0;
	}
	return 1;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++) g[i].clear();
		for(int i=1,u,v,w;i<=m;i++){
			cin>>u>>v>>w;
			g[u].push_back({v,w});
			if(w>=0) g[v].push_back({u,w});
		}
		if(bf()) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

Floyd

PID:B3647

//B3647【模板】Floyd
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,f[110][110];
void floyd(){
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	memset(f,0x3f,sizeof f);
	for(int i=1;i<=n;i++) f[i][i]=0;
	for(int i=1,u,v,w;i<=m;i++){
		cin>>u>>v>>w;
		f[u][v]=f[v][u]=min(f[u][v],w);
	}
	floyd();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) cout<<f[i][j]<<" ";
		cout<<"\n";
	}
	return 0;
}

并查集(?)

PID:P3367

//P3367 【模板】并查集
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,fa[600010],x_,z_,y_;
void init(){
	for(int i=1;i<=n;i++) fa[i]=i;
}
int fid(int x){
	if(x!=fa[x]) fa[x]=fid(fa[x]);
	return fa[x];
}
void Union(int x,int y){
	int a=fid(x),b=fid(y);
	if(a!=b) fa[b]=a;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	init();
	while(m--){
		cin>>z_>>x_>>y_;
		if(z_==2){
			if(fid(x_)==fid(y_)) cout<<"Y\n";
			else cout<<"N\n";
		}
		if(z_==1) Union(x_,y_);
	}
	return 0;
}
posted @ 2026-09-28 16:53  _T_M_T  阅读(3)  评论(0)    收藏  举报