第四次比赛

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背包,但是需要排序,viwj>vjwi=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;
}

  

 

posted @ 2024-02-03 13:03  伊芙加登  阅读(11)  评论(0)    收藏  举报