D.网络寻路(dfs,但是可以简便方法)
#include<bits/stdc++.h>
using namespace std;
int s[100000],a[100010],b[100010];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>a[i]>>b[i];
s[a[i]]++;
s[b[i]]++;
}
int t=0;
for(int i=0;i<m;i++)
{
if(s[a[i]]>1&&s[b[i]]>1)
t+=(s[a[i]]-1)*(s[b[i]]-1)*2;
}
cout<<t<<endl;
return 0;
}
E.全球变暖(bfs)
#include<bits/stdc++.h>
using namespace std;
char c[1000][1000],d[1000][1000];
int ans,xx[]={1,-1,0,0},yy[]={0,0,1,-1};
int v=1,vv[1000][1000];
int lu(int x,int y)//判断是否为陆地
{
if(c[x][y]=='#')return 1;
else return 0;
}
int dfs(int x,int y)
{
vv[x][y]=1;//标记,代表已经搜索过
if(lu(x-1,y)&&lu(x+1,y)&&lu(x,y+1)&&lu(x,y-1))v=0;//不会沉没,记为0
for(int i=0;i<4;i++)
{
int x1=x+xx[i],y1=y+yy[i];//扩张
if(lu(x1,y1)&&vv[x1][y1]==0)
dfs(x1,y1);
}
c[x][y]='.';
return v;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>c[i][j],d[i][j]=c[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(lu(i,j))v=1,ans+=dfs(i,j);
cout<<ans<<endl;
return 0;
}
F.出差(dijkstra)
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
const int N=1e5+5,inf=0x3f3f3f3f;
int n,m,add[N],dis[N];
bool vis[N]={0};
vector<pii> G[N];
void dijkstra()//Dijkstra
{
for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
dis[1]=0;
priority_queue<pii,vector<pii>,greater<pii> >p;//堆优化
p.push({0,1});
while(!p.empty())
{
int u=p.top().second;
p.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int cost=G[u][i].second,v=G[u][i].first;
if(dis[v]>dis[u]+cost)
{
dis[v]=dis[u]+cost;
p.push({dis[v],v});
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>add[i];
for(int i=1;i<=m;i++)
{
int a,b,len;
cin>>a>>b>>len;
G[a].push_back({b,len+add[b]});
G[b].push_back({a,len+add[a]});
//vector存图,加上目的地点权
}
dijkstra();
cout<<dis[n]-add[n];//终点不用隔离
}
G.搬砖(01背包,但是需要排序,vi−wj>vj−wi=vi+wi>vj+wj 第 i 个箱子放在第 j 个箱子下面就显然更优)
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
int w[10000],v[10000],id[10000];
int f[20010];
bool cmp(int x,int y)//这个排序还挺好用的,学费了
{
return w[x]+v[x]<w[y]+v[y];
}
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
id[i]=i;
}
sort(id+1,id+n+1,cmp);
for(int i=1;i<=n;i++)
for(int j=w[id[i]]+v[id[i]];j>=w[id[i]];j--)
{
f[j]=max(f[j],f[j-w[id[i]]]+v[id[i]]);
ans=max(ans,f[j]);
}
cout<<ans<<endl;
return 0;
}