B.Harborfan的新年拜访Ⅱ

就是一道tarjan缩点的裸题。

建图比较麻烦

以后遇到这种建图,先用循环把样例实现出来,再对着循环写建图公式

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
vector<int> g[maxn];
string s1,s2;
int N,M;
int low[maxn];
int dfn[maxn];
int pos[maxn];
stack<int> st;
int scc;
int cnt;
void tarjan (int x) {
low[x]=dfn[x]=++cnt;
st.push(x);
for (int i=;i<g[x].size();i++) {
if (!low[g[x][i]]) {
tarjan(g[x][i]);
low[x]=min(low[x],low[g[x][i]]);
}
else if (!pos[g[x][i]])low[x]=min(low[x],dfn[g[x][i]]);
}
if (low[x]==dfn[x]) {
scc++;
while () {
int u=st.top();
st.pop();
low[u]=low[x];
pos[u]=scc;
if (u==x) break;
}
}
}
int main () {
scanf ("%d %d",&N,&M);
cin>>s1>>s2;
/*for (int i=2;i<=6;i++) g[i].push_back(i-1);
for (int i=8;i<=12;i++) g[i-1].push_back(i);
for (int i=14;i<=18;i++) g[i].push_back(i-1);
for (int i=20;i<=24;i++) g[i-1].push_back(i);
for (int i=7;i<=19;i+=6) g[i-6].push_back(i);
for (int i=8;i<=20;i+=6) g[i].push_back(i-6);
for (int i=9;i<=21;i+=6) g[i-6].push_back(i);
for (int i=10;i<=22;i+=6) g[i].push_back(i-6);
for (int i=11;i<=23;i+=6) g[i-6].push_back(i);
for (int i=12;i<=24;i+=6) g[i].push_back(i-6); */
for (int i=;i<s1.length();i++) {
for (int j=i*M+;j<=(i+)*M;j++) {
if (s1[i]=='>') g[j-].push_back(j);
else g[j].push_back(j-);
}
}
for (int i=;i<s2.length();i++) {
for (int j=M+i+;j<=M*(N-)++i;j+=M) {
if (s2[i]=='v') g[j-M].push_back(j);
else g[j].push_back(j-M);
}
}
for (int i=;i<=N*M;i++) if (!low[i]) tarjan(i);
//printf ("%d\n",scc);
if (scc==) printf ("YES");
else printf ("NO");
return ;
}

E.

爆搜即可,需要注意的是,一个单位代表四面墙,每一次爆搜,把搜到的点记录下来,之后询问就直接输出答案,避免tle~

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
string s[maxn];
int g[maxn][maxn];
int N,M,K;
struct node {
int x,y;
};
int X[]={,,-,};
int Y[]={,,,-};
int visit[maxn][maxn];
int visit1[maxn][maxn][];
int q1[maxn][maxn];
int judge (int x,int y) {
if (x<||x>N||y<||y>M) return ;
return ;
}
int bfs (int x,int y,int z) {
queue<node> q;
q.push({x,y});
memset(visit,,sizeof(visit));
memset(visit1,,sizeof(visit1));
visit[x][y]=;
int ans=;
q1[x][y]=z;
while (!q.empty()) {
node u=q.front();
q.pop();
for (int i=;i<;i++) {
int tx=u.x+X[i];
int ty=u.y+Y[i];
if (!judge(tx,ty)) continue;
if (visit[tx][ty]) continue;
if (visit1[tx][ty][i]) continue;
if (g[tx][ty]==) {
q.push({tx,ty});
visit[tx][ty]=;
q1[tx][ty]=z;
continue;
}
if (g[tx][ty]==) {
ans++;
visit1[tx][ty][i]=;
}
}
}
return ans;
}
int ans[maxn*];
int main () {
scanf ("%d %d %d",&N,&M,&K);
for (int i=;i<=N;i++) cin>>s[i];
for (int i=;i<=N;i++) {
for (int j=;j<s[i].length();j++) {
g[i][j+]=s[i][j]=='.'?:;
}
}
int x,y;
for (int i=;i<K;i++) {
scanf ("%d %d",&x,&y);
if (q1[x][y]) {
printf ("%d\n",ans[q1[x][y]]);
continue;
}
ans[i+]=bfs(x,y,i+);
printf ("%d\n",ans[i+]);
}
return ;
}

ACM-ICPC实验室20.2.19测试-图论的更多相关文章

  1. ACM-ICPC实验室20.2.21测试-图论(二)

    A.患者的编号 给出一个有向图,要求你输出字典序最小的拓扑排序. 常规拓扑排序是做不了的,正解是反向建图,同时用大根堆的优先队列维护,保证每次优先访问编号大的结点,再反向输出~ #include< ...

  2. 2019年安徽大学ACM/ICPC实验室新生赛(公开赛)D 不定方程

    题目链接:https://ac.nowcoder.com/acm/contest/2720/D 题意:对于 ax = by = c ,给出 x, y 求符合条件的 a, b, c 且 c 为最小的解, ...

  3. ACM-ICPC实验室20.2.22测试-动态规划

    C.田忌赛马 直接贪心做就可以~ #include<bits/stdc++.h> using namespace std; ; int a[maxn],b[maxn]; int main( ...

  4. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  5. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online

    网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...

  6. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  7. hduoj 4715 Difference Between Primes 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Time Limit: 2000/1000 MS (J ...

  8. hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  9. Java in ACM/ICPC

    目录 Java在ACM/ICPC中的特点 在ACM/ICPC中使用Java需要注意的问题 Java与高精度计算 1.Java在ACM/ICPC中的特点 Java的语法和C++几乎相同 Java在执行计 ...

随机推荐

  1. 基本程序单元Activity

    Activity的4种状态,运行状态,暂停状态,停止状态,销毁状态,下面就是生命周期的顺序图 手动创建Activity 1.创建继承自Activity的Activity 2.重写需要的回调方法 3.设 ...

  2. jenkins 集成环境搭建

    http://www.cnblogs.com/jenniferhuang/p/3355252.html

  3. PHP 把秒数转为时分秒格式

    PHP函数 1.gmdate $seconds = 174940;$hours = intval($seconds/); $time1 = $hours."小时".gmdate(' ...

  4. mongodb多字段去重

    单字段去重 db.student.distinct("name"); 多字段去重 db.student.aggregate([{      $group:{            ...

  5. Myeclipse异常

    打不开文件 问题描述:Myeclipse然打开什么东西都报错了:Could not open the editor: Invalid thread access 解决方法:1.cmd 2.cd 进入你 ...

  6. 通过恢复目录(Catalogue)进行PDB级别的PITR恢复

    数据库版本:Oracle 12.2.0.1 本篇为<执行PDB的PITR恢复失败的说明 (文档 ID 2435452.1)>的证明篇,通过当前控制文件,无法在PDB级别进行PITR(Poi ...

  7. jvm 结构分析

    jvm区域总体分两类,heap区和非heap区.heap区又分: Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分 ...

  8. 如何在Word中批量选中特定文本

    如何在Word中批量选中特定文本 举个例子,我们对如下文本进行操作,将文本中所有的“1111111”标红,所有的“2222222”标绿,所有的“3333333”标蓝 在Word中找到“查找”下的“高级 ...

  9. 通过属性选择器找元素,可以通过$(__).length是否为0来判断是否找到了元素

    通过属性选择器找元素,可以通过$("").length是否为0来判断是否找到了元素. 为0的时候表示没有找到,其余则返回找到了多少个. 不能通过$("")是否为 ...

  10. 防止不同账号之间localStorage数据错误

    set和get的时候,key后面加上用户ID