0
点赞
收藏
分享

微信扫一扫

广搜+思维题+拓扑

搬砖的小木匠 2022-04-27 阅读 41
算法

P3243 [HNOI2015]菜肴制作
应该很能看出是个拓扑排序,每道菜肴都有约束条件。

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e5+5;
int n,m,p,c[maxn],u,cnt,in[maxn],head[maxn],ans[maxn],g;
bool vis[maxn],flag;
priority_queue<int>q;
struct node
{
    int to,nxt;
}e[maxn];
void add(int from,int to)
{
    e[++cnt].to=to;
    e[cnt].nxt=head[from];
    head[from]=cnt;
}
void clean()
{
    memset(head,0,sizeof(head));
    memset(in,0,sizeof(in));
    memset(c,0,sizeof(c));
    memset(ans,0,sizeof(ans));
    cnt=0;g=0;
    while(!q.empty()) q.pop();
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        clean();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v;scanf("%d%d",&u,&v);
            add(v,u);in[u]++;
        }
        for(int i=1;i<=n;i++)
            if(!in[i]) q.push(i);
        while(!q.empty())
        {
            int u=q.top();q.pop();
            ans[++g]=u;
            for(int i=head[u];i;i=e[i].nxt)
            {
                int v=e[i].to;
                in[v]--;
                if(!in[v]) q.push(v);
            }
        }
        if(g<n)
            printf("Impossible!\n");
        else{
            for(int i=n;i>=1;i--)
            {
                printf("%d ",ans[i]);
            }
            cout<<endl;
            }
    }
    return 0;
}

P1747 好奇怪的游戏
一道搜索的模拟题,注意细节。

#include <bits/stdc++.h>

using namespace std;
struct node
{
    int x,y;
    int step;
};
int dx[12]={2,-2,2,-2,1,1,-1,-1,2,2,-2,-2};
int dy[12]={2,2,-2,-2,2,-2,2,-2,1,-1,1,-1};
bool vis[1000][1000];
queue<node>q;
void bfs(int x,int y)
{
    node cur,nxt;
    cur.x=x;
    cur.y=y;
    cur.step=0;
    q.push(cur);
    vis[x][y]=1;
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        if(cur.x==1&&cur.y==1)
        {
            cout<<cur.step<<endl;
            return;
        }
        for(int i=0;i<12;i++)
        {
            nxt.x=cur.x+dx[i];
            nxt.y=cur.y+dy[i];
            if(vis[nxt.x][nxt.y]==0 &&nxt.x>=1&&nxt.y>=1)
            {
                vis[nxt.x][nxt.y]=1;
                nxt.step=cur.step+1;
                q.push(nxt);
            }
        }
    }
}
int main()
{
    int x1,y_1,x2,y2;
    cin>>x1>>y_1>>x2>>y2;
    bfs(x1,y_1);

    memset(vis,0,sizeof(vis));
    while(!q.empty())  //²»Îª¿Õʱ·µ»Ø0
        q.pop();

    bfs(x2,y2);
    return 0;
}

一道省赛思维题,难点在于题意得理解,不过根据样例也能猜的八九不离十。思维上对于我来说也是有点难度。。。。

#include <bits/stdc++.h>

using namespace std;
const int N=3e5+5;
int n,ans1,ans2,a[N],b[N];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x,y;cin>>x>>y;
        ans1+=4;ans2+=4;
        if(a[x])
            ans1-=2;
        if(b[x])
            ans2-=2;
        if(a[x]<a[x+1])
            ans1-=2;
        if(x>=1&&a[x]<a[x-1])
            ans1-=2;

        if(b[y]<b[y+1])
            ans2-=2;
        if(y>=1&&b[y]<b[y-1])
            ans2-=2;
        a[x]++;b[y]++;
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}

举报

相关推荐

0 条评论