当前位置:网站首页>2/10 parallel search set +bfs+dfs+ shortest path +spfa queue optimization
2/10 parallel search set +bfs+dfs+ shortest path +spfa queue optimization
2022-07-06 04:03:00 【Zhong Zhongzhong】
Made a good question :
The longest path + Chain forward star +spfa
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
int head[maxn],d,p,c,f,s,cnt,pp[maxn],dis[maxn];
bool vis[maxn],flag;
struct node
{
int to,dis,nxt;
}e[maxn];
void add_edge(int from,int to,int w)
{
e[++cnt].to=to;
e[cnt].dis=w;
e[cnt].nxt=head[from];
head[from]=cnt;
}
queue<int>q;
void spfa()
{
dis[s]=d;
q.push(s);
vis[s]=1;
pp[s]++;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=0;
if(++pp[u]>c)
{
printf("-1\n");
flag=1;
return;
}
for(int i=head[u];~i;i=e[i].nxt)
{
int v=e[i].to;
if(dis[v]<dis[u]+e[i].dis)
{
dis[v]=dis[u]+e[i].dis;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&d,&p,&c,&f,&s);
head[0]=-1;
for(int i=1;i<=c;i++)
head[i]=-1;
for(int i=1;i<=p;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v,d);
}
for(int i=1;i<=f;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,d-w);
}
spfa();
if(flag)
return 0;
int tmp=0;
for(int i=1;i<=c;i++)
{
tmp=max(tmp,dis[i]);
}
cout<<tmp<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P4826
A maximum spanning tree problem , I don't understand the explanation . The key is the following processing , The object of joint search is undirected edge , Therefore, there is no need to build edges in both directions like the shortest path .
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(i!=j)
add_edge(i,j,a[i]^a[j]);
}
}
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=5e6+5;
int n,m,a[2005],f[2005],minn=inf,cnt,g;
struct node
{
int l,r,w;
}e[maxn];
void add_edge(int from,int to,int w)
{
e[++cnt].l=from;
e[cnt].r=to;
e[cnt].w=w;
}
bool cmp(node e1,node e2)
{
return e1.w>e2.w;
}
int r_find(int r)
{
while(r==f[r])
return r;
return f[r]=r_find(f[r]);
}
void kruskal()
{
long long sum=0;
for(int i=1;i<=cnt;i++)
{
int fx=r_find(e[i].l),fy=r_find(e[i].r);
if(fx==fy)
continue;
g++;
f[fx]=fy;
sum+=e[i].w;
if(g==n-1)
break;
}
cout<<sum<<endl;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(i!=j)
add_edge(i,j,a[i]^a[j]);
}
}
sort(e+1,e+cnt+1,cmp);
kruskal();
return 0;
}
2.bfs
mp Record the points on the chart and arrive in several steps
f[100005][3]: Look for the a,b Data range of , Here is how many points exist
bool vis[maxn][maxn]: Judge whether this point has passed , There's a caveat , Reaching this point first means that it takes the least time
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=5050;
int mp[maxn][maxn],f[100005][3],n,m,a,b;
bool vis[maxn][maxn];
int dx[4]={
1,-1,0,0};
int dy[4]={
0,0,-1,1};
struct node
{
int x,y,step;
};
queue<node>q;
void tag(int x,int y)
{
node cur;
cur.x=x;
cur.y=y;cur.step=0;
q.push(cur);
vis[x][y]=1;
return;
}
void bfs()
{
node cur,nxt;
while(!q.empty()) // Not empty return 0
{
cur=q.front();
mp[cur.x][cur.y]=cur.step;
q.pop();
for(int i=0;i<4;i++)
{
int x=cur.x+dx[i];
int y=cur.y+dy[i];
if(x>=1&&x<=n&&y>=1&&y<=n&&!vis[x][y])
{
vis[x][y]=1;
nxt.x=x;nxt.y=y;
nxt.step=cur.step+1;
q.push(nxt);
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i=1;i<=a;i++)
{
int x,y;scanf("%d%d",&x,&y);
tag(x,y);
}
for(int i=1;i<=b;i++)
{
scanf("%d%d",&f[i][1],&f[i][2]);
}
bfs();
for(int i=1;i<=b;i++)
{
printf("%d\n",mp[f[i][1]][f[i][2]]);
}
return 0;
}
3.https://www.luogu.com.cn/problem/P2196
A very classic deep search topic .
From the transformation of state :
If there is a road connected with the current floor and it has not been visited , It means that you can always dig down ;
When the digging goes on , Just record the path , Sum maximum , Go back ;
The importance of backtracking is needless to say
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=50;
int a[maxn],f[maxn][maxn],n,m,b,path[maxn],tmp,ans[maxn],gg;
bool vis[maxn];
int check(int x)
{
for(int i=1;i<=n;i++)
{
if(f[x][i]&&!vis[i]) // It can also dig down and return 1
return 1;
}
return 0; // I can't dig any more and return 0
}
void dfs(int x,int step,int sum)
{
if(!check(x))
{
if(tmp<sum)
{
tmp=sum;gg=step;
for(int i=1;i<=step;i++)
ans[i]=path[i];
}
return;
}
for(int i=1;i<=n;i++)
{
if(f[x][i]&&!vis[i])
{
vis[i]=1;
path[step+1]=i;
dfs(i,step+1,sum+a[i]);
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int x;scanf("%d",&x);
f[i][j]=x;
}
}
for(int i=1;i<=n;i++)
{
path[1]=i;
vis[i]=1;
dfs(i,1,a[i]);
vis[i]=0;
}
for(int i=1;i<=gg;i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
cout<<tmp<<endl;
return 0;
}
Graph storage of chained forward stars + Deep search
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
struct node
{
int to,dis,nxt;
}e[maxn];
int head[maxn],f[maxn],n,m,cnt;
bool vis[maxn];
void add_edge(int from,int to,int dis)
{
e[++cnt].to=to;
e[cnt].dis=dis;
e[cnt].nxt=head[from];
head[from]=cnt;
}
void dfs(int x,int val)
{
f[x]=val;
vis[x]=1;
for(int i=head[x];~i;i=e[i].nxt)
{
if(!vis[e[i].to])
dfs(e[i].to,val^e[i].dis);
}
}
int main()
{
scanf("%d",&n);
head[0]=-1;
for(int i=1;i<=n;i++)
head[i]=-1;
for(int i=1;i<=n-1;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);add_edge(v,u,w);
}
dfs(1,0);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
cout<<(f[x]^f[y])<<endl;
}
return 0;
}
边栏推荐
- Facebook等大厂超十亿用户数据遭泄露,早该关注DID了
- Factors affecting user perception
- 3分钟带你了解微信小程序开发
- DM8 archive log file manual switching
- cookie,session,Token 这些你都知道吗?
- Viewing and verifying backup sets using dmrman
- asp. Core is compatible with both JWT authentication and cookies authentication
- Custom event of C (31)
- Security xxE vulnerability recurrence (XXe Lab)
- Développement d'un module d'élimination des bavardages à clé basé sur la FPGA
猜你喜欢

Record the pit of NETCORE's memory surge

mysql关于自增长增长问题

Redis (replicate dictionary server) cache
![[practice] mathematics in lottery](/img/29/2ef2b545d92451cf083ee16e09ffb4.jpg)
[practice] mathematics in lottery

记一次excel XXE漏洞

Record an excel xxE vulnerability

2.13 weekly report

What is the difference between gateway address and IP address in tcp/ip protocol?

在 .NET 6 中使用 Startup.cs 更简洁的方法

An article will give you a comprehensive understanding of the internal and external components of "computer"
随机推荐
The Research Report "2022 RPA supplier strength matrix analysis of China's banking industry" was officially launched
Global and Chinese markets for endoscopic drying storage cabinets 2022-2028: Research Report on technology, participants, trends, market size and share
Benefits of automated testing
SSTI template injection explanation and real problem practice
Facebook and other large companies have leaked more than one billion user data, and it is time to pay attention to did
asp. Core is compatible with both JWT authentication and cookies authentication
MySql數據庫root賬戶無法遠程登陸解决辦法
C form application of C (27)
How do we make money in agriculture, rural areas and farmers? 100% for reference
[optimization model] Monte Carlo method of optimization calculation
Class A, B, C networks and subnet masks in IPv4
Yyds dry goods inventory web components series (VII) -- life cycle of custom components
Take you to wechat applet development in 3 minutes
mysql关于自增长增长问题
C language -- structs, unions, enumerations, and custom types
Scalpel like analysis of JVM -- this article takes you to peek into the secrets of JVM
MySQL reads missing data from a table in a continuous period of time
Leetcode32 longest valid bracket (dynamic programming difficult problem)
Database, relational database and NoSQL non relational database
C#(二十七)之C#窗体应用