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; }
标签:比赛,int,add,lu,第四次,include,id,1000 From: https://www.cnblogs.com/violet-hty/p/18004562