模板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;
}

浙公网安备 33010602011771号