1.dfs
找最长链
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
vector<int>a[N];
int t[N];
int n;
vector<int>temp;
void dfs(int t,vector<int>&p){
if(p.size()>temp.size()) {
temp.clear();
temp = p;
}
for(auto u:a[t]){
p.push_back(u);
dfs(u,p);
p.pop_back();
}
}
int main(){
cin>>n;
temp.reserve(n);
memset(t,0,sizeof t);
for(int i=0;i<n;i++){
int k;
cin>>k;
for(int j=0;j<k;j++){
int p=0;
cin>>p;
t[p]=1;
a[i].push_back(p);
}
sort(a[i].begin(),a[i].end());
}
for(int i=0;i<n;i++){
if(!t[i]) {
vector<int> p;
p.reserve(n);
p.push_back(i);
dfs(i,p);
}
}
cout<<temp.size()<<endl;
for(int i=0;i<temp.size();i++){
cout<<temp[i];
if(i!=temp.size()-1) cout<<" ";
}
return 0;
}
2.数据结构:栈和容器的简单应用
#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
int n;
int main(){
string a,b;
cin>>a>>b;
stack<char>p;
vector<string>arr(100);
int k=a.size();
int i=0;
int j=0;
int op=0;
while(k){
if(p.size()!=0&&p.top()==b[j]){
arr[op++]="3->2";
p.pop();
j++;
continue;
}
if(a[i]==b[j]) {
arr[op++] = "1->2";
j++;
}
else {
arr[op++]="1->3";
p.push(a[i]);
}
i++;
k--;
}
int s=0;
int sizep=p.size();
for( i=a.size()-sizep;i<a.size();i++){
if(b[i]==p.top())s++;
p.pop();
arr[op++]="3->2";
}
if(s==sizep) {
for(i=0;i<op;i++){
cout<<arr[i]<<endl;
}
}
else cout<<"Are you kidding me?";
return 0;
}
3.Floyd算法
#include<bits/stdc++.h>
using namespace std;
const int inf=99999;
const int maxn=101;
int n,m,D[maxn][maxn];
void Floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
}
}
}
int main()
{
fill(D[0],D[0]+maxn*maxn,inf);
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
D[a][b]=D[b][a]=c;
}
Floyd();
int index=0,min=inf,max;
for(int i=1;i<=n;i++){
max=0;
for(int j=1;j<=n;j++){
if(i==j) continue;
if(D[i][j]>max) max=D[i][j];
}
if(max<min){
min=max;
index=i;
}
}
if(index==0) cout<<"0\n";
else cout<<index<<" "<<min<<endl;
return 0;
}
4.并查集问题。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n;
vector<int>a;
int find(int x){
if(x!=a[x]) a[x]=find(a[x]);
return a[x];
}
void connect(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx==yy) return ;
a[yy]=xx;
}
int main(){
cin>>n;
a.reserve(n);
for(int i=1;i<=n;i++){
a[i]=i;
}
char s;
cin>>s;
while(s!='S'){
int x,y;
cin>>x>>y;
if(s=='I') connect(x,y);
else {
if(find(x)==find(y)) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
cin>>s;
}
set<int>b;
for(int i=1;i<=n;i++){
b.insert(find(i));
}
if(b.size()==1) cout<<"The network is connected.";
else cout<<"There are "<<b.size()<<" components.";
return 0;
}
7-12 部落
5.并查集问题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010;
int arr[N];
int Find(int x)
{
if (arr[x]!=x)
arr[x]=Find(arr[x]);
return arr[x];
}
void Connect(int x,int y){
int mm=Find(x);
int nn=Find(y);
if(mm==nn) return ;
arr[nn]=mm;
}
int main(){
memset(arr,0,sizeof arr);
int n;
cin>>n;
for(int i=1;i<N;i++){
arr[i]=i;
}
int maxn=0;
for(int i=0;i<n;i++){
int a;
cin>>a;
int q[a];
for(int j=0;j<a;j++){
cin>>q[j];
maxn=max(maxn,q[j]);
if(j!=0)
Connect(q[j-1],q[j]);
}
}
set<int>s;
for(int j=1;j<=maxn;j++){
s.insert(Find(arr[j]));
}
cout<<maxn<<" "<<s.size()<<endl;
int time =0;
cin>>time;
for(int i=0;i<time;i++){
int t1,t2;
cin>>t1>>t2;
if(Find(t1)==Find(t2)) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}
6.并查集问题提升
#include<bits/stdc++.h>
using namespace std;
int n,co;
const int N = 1e4+10;
struct edge{
int a,b;
}e[N];
bool st[N];
int fa[N],peo[N],avgs[N],avga[N];
int find(int x)
{
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void unionf(int a,int b)
{
int faa=find(a),fbb=find(b);
if(faa!=fbb)
{
fa[max(faa,fbb)]=min(faa,fbb); //把id号较小的那个人设定为父亲
peo[min(faa,fbb)]+=peo[max(faa,fbb)]; //把人数加到较小id的人数那里
avgs[min(faa,fbb)]+=avgs[max(faa,fbb)]; //把房屋数量加到较小id的人数那里
avga[min(faa,fbb)]+=avga[max(faa,fbb)]; //把房屋面积加到较小id的人数那里
}
}
struct family{
int id,cnt,avgs,avga;
bool operator < (family x)
{
if(x.cnt*avga==cnt*x.avga)
{
return id<x.id;
}
return x.cnt*avga>cnt*x.avga;
}
};
int main()
{
for(int i=0;i<N;i++) fa[i]=i,peo[i]=1;
cin>>n;
int id,father,mother,k;
for(int i=0;i<n;i++)
{
cin>>id>>father>>mother>>k;
if(father!=-1) e[co++]={id,father};
if(mother!=-1) e[co++]={id,mother};
st[id]=true; //有的人可能只有一个人,需要特殊标记
int kid;
for(int j=0;j<k;j++)
{
cin>>kid;
e[co++]={id,kid};
}
cin>>avgs[id]>>avga[id];
}
for(int i=0;i<co;i++)
{
int a=e[i].a,b=e[i].b;
st[a]=st[b]=true;
unionf(a,b);
}
vector<family> ans;
for(int i=0;i<N;i++)
{
if(st[i] && fa[i]==i) //这个人真实存在并且父亲结点是自己,就加进去
ans.push_back({i,peo[i],avgs[i],avga[i]});
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<endl;
for(auto t:ans) printf("%04d %d %.3lf %.3lf\n",t.id,t.cnt,(double)t.avgs/t.cnt,(double)t.avga/t.cnt);
return 0;
}
7.背包
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
#define PII pair<int,int>
int n;
vector<PII>a(N);
int dp[N][15];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
a[i].first=*s.begin() - '0';
a[i].second=*s.rbegin() - '0';
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 9; j++) {
if (j == a[i].second) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][a[i].first] + 1);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
int m = 0;
for (int j = 0; j <= 9; j++) {
m = max(m, dp[n][j]);
}
cout << n - m ;
return 0;
}