暑假集训day1

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假集训day1相关的知识,希望对你有一定的参考价值。

其实这是前天的事了。(现在时间回到两天前)

今天的主要内容是最短路和2-SAT

最短路我做了一题:水灾;题目详情见9018-1452

先bfs求出洪水漫延到每一个点的时间。

然后再跑一遍bfs求出最短路即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int INF=0x7fffffff;
int n,m,sx,sy,dx,dy,h=0,now=0;
int t[51][51],map[51][51]={0};
char c[51];
struct hs{int x,y,s;}q[10010];
int xx[4]={-1,0,0,1},yy[4]={0,-1,1,0};
void bfs(){
    while(now!=h){
        int x=q[now].x,y=q[now].y;now++;
        for(int i=0;i<4;i++){
            int nx=x+xx[i],ny=y+yy[i];
            if(nx>n||ny>m||nx<1||ny<1||map[nx][ny])continue;
            if((nx==dx&&ny==dy)||t[nx][ny]!=INF)continue;
            t[nx][ny]=t[x][y]+1;q[h].x=nx;q[h].y=ny;h++;
        }
    }
}
void BFS(){
    now=0;h=1;q[0].x=sx;q[0].y=sy;q[0].s=0;
    while(now!=h){
        int x=q[now].x,y=q[now].y,s=q[now].s;now++;
        for(int i=0;i<4;i++){
            int nx=x+xx[i],ny=y+yy[i];
            if(nx>n||ny>m||nx<1||ny<1||map[nx][ny]||s+1>=t[nx][ny])continue;
            map[nx][ny]=1;
            if(nx==dx&&ny==dy){printf("%d",s+1);return;}
            q[h].x=nx;q[h].y=ny;q[h].s=s+1;h++;
        }
    }
    printf("ORZ hzwer!!!");
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)t[i][j]=INF;
    for(int i=1;i<=n;i++){
        scanf("%s",c);
        for(int j=1;j<=m;j++){
            if(c[j-1]==\'D\')dx=i,dy=j;
            else if(c[j-1]==\'S\')sx=i,sy=j;
            else if(c[j-1]==\'X\')map[i][j]=1;
            else if(c[j-1]==\'*\'){q[h].x=i;q[h].y=j;t[i][j]=0;h++;}
        }
    }
    bfs();BFS();
    return 0;
}

关于2-SAT有这样一题:Astronauts;题目详情见UVA1391或UVALive3713

这题就是简单的2-SAT模板

详情见代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
inline int read(){
    int num=0,t=1;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();}
    return num*t;
}
const int maxn=100010;
int n,m,mark[maxn*2],s[maxn*2],c;
vector<int> g[maxn*2];
void add(int x,int a,int y,int b){
    x=x*2+a;y=y*2+b;
    g[x^1].push_back(y);g[y^1].push_back(x); 
}
bool dfs(int x){
    if(mark[x^1])return 0;
    if(mark[x])return 1;
    mark[x]=1;s[c++]=x;
    for(int i=0;i<g[x].size();i++)if(!(dfs(g[x][i])))return 0;
    return 1;
}
bool solve(){
    for(int i=0;i<n*2;i+=2){
        if(!mark[i]&&!mark[i+1]){
            c=0;
            if(!dfs(i)){
                while(c>0)mark[s[--c]]=0;
                if(!(dfs(i+1)))return 0;
            }
        }
    }
    return 1;
}
int tot,age[maxn];
int is_young(int x){
  return age[x]*n<tot;
}
int main() {
    while(1) {
    n=read();m=read();if(n+m==0)break;
    tot=0;for(int i=0;i<2*n;i++)g[i].clear();memset(mark,0,sizeof(mark));
    for(int i=0;i<n;i++)age[i]=read(),tot+=age[i];
        for(int i=1;i<=m;i++){
        int a,b;a=read();b=read();a--;b--;if(a==b)continue;
        add(a,1,b,1);if(is_young(a)==is_young(b))add(a,0,b,0); 
    }
    if(!solve())puts("No solution.");
    else for(int i=0;i<n;i++)
        if(mark[i*2])puts("C");
        else if(is_young(i))puts("B");
        else puts("A");
    }
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

以上是关于暑假集训day1的主要内容,如果未能解决你的问题,请参考以下文章

暑假集训Day1 B(拓展欧拉定理)

暑假集训Day1 A(gcd)

2019暑假集训DAY1(problem3.play)(单调栈思想)

暑假清北学堂集训笔记

暑假集训-8.02总结

2022.07.14 暑假集训 个人排位赛