poj 3592 Instantaneous Transference
http://poj.org/problem?id=3592
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define maxn 300000
using namespace std; const int inf=-<<;
int e,head[maxn],belong[maxn],stack1[maxn],top,dfn[maxn],low[maxn],bcc_clock,bcnt,n,m,num1[][],num,gg[maxn],point[maxn],cc[maxn],ee,head1[maxn],dis[maxn],cnt[maxn],temp;
bool vis[maxn],visi[maxn];
int dir[][]= {{,},{,}};
struct node
{
int u,v,next;
} p[maxn];
struct node1
{
int u,v,w,next;
} pp[maxn];
char g[][]; void add(int u,int v)
{
p[e].u=u;
p[e].v=v;
p[e].next=head[u];
head[u]=e++;
} void addnode(int u,int v,int w)
{
pp[ee].v=v;
pp[ee].u=u;
pp[ee].w=w;
pp[ee].next=head1[u];
head1[u]=ee++;
} void tarjan(int u)
{
vis[u]=true;
dfn[u]=low[u]=++bcc_clock;
stack1[++top]=u;
for(int i=head[u]; i!=-; i=p[i].next)
{
int v=p[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
bcnt++;
int j;
do
{
j=stack1[top--];
vis[j]=false;
belong[j]=bcnt;
}
while(j!=u);
}
} void init()
{ memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(belong,,sizeof(belong));
memset(cc,,sizeof(cc));
memset(vis,false,sizeof(vis));
} void del()
{
init();
for(int i=; i<n*m; i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
} bool ralex(int u,int v,int c)
{
if(dis[v]<dis[u]+c)
{
dis[v]=dis[u]+c;
return true;
}
return false;
} bool spfa(int src)
{
memset(visi,false,sizeof(visi));
memset(cnt,,sizeof(cnt));
visi[src]=true;
for(int i=; i<=bcnt; i++)
{
dis[i]=inf;
}
queue<int>q;
q.push(src);
dis[src]=;
while(!q.empty())
{
int u=q.front();
q.pop();
visi[u]=false;
for(int i=head1[u]; i!=-; i=pp[i].next)
{
if(ralex(u,pp[i].v,pp[i].w)&&!visi[pp[i].v])
{
if((++cnt[pp[i].v])>n*m) return false;
q.push(pp[i].v);
visi[pp[i].v]=true;
}
}
}
temp=;
for(int i=; i<bcnt+; i++)
{
temp=max(temp,dis[i]);
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
num=;
int cn=;
memset(head1,-,sizeof(head1));
memset(head,-,sizeof(head));
e=,top=,bcnt=,bcc_clock=,ee=;
getchar();
for(int i=; i<n; i++)
{
scanf("%s",g[i]);
}
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
int k=i*m+j;
if(g[i][j]=='#')
{
gg[k]=-;
continue;
}
else
{
if(g[i][j]=='*')
{
point[cn++]=k;
gg[k]=;
}
else if(g[i][j]>=''&&g[i][j]<='')
{
gg[k]=g[i][j]-'';
}
for(int c=; c<; c++)
{
int xx=i+dir[c][];
int yy=j+dir[c][];
if(xx<n&&yy<m)
{
if(g[xx][yy]!='#')
{
add(k,xx*m+yy);
}
}
} }
}
}
for(int i=; i<cn; i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(g[x][y]!='#')
{
add(point[i],x*m+y);
}
}
del();
for(int i=; i<n*m; i++)
{
cc[belong[i]]+=gg[i];
}
addnode(,belong[],cc[belong[]]);
for(int i=; i<n*m; i++)
{
for(int j=head[i]; j!=-; j=p[j].next)
{
int v=p[j].v;
if(belong[i]!=belong[v])
{
addnode(belong[i],belong[v],cc[belong[v]]);
}
}
}
spfa();
printf("%d\n",temp);
}
return ;
}
poj 3592 Instantaneous Transference的更多相关文章
- POJ 3592 Instantaneous Transference(强连通+DP)
POJ 3592 Instantaneous Transference 题目链接 题意:一个图.能往右和下走,然后有*能够传送到一个位置.'#'不能走.走过一个点能够获得该点上面的数字值,问最大能获得 ...
- poj 3592 Instantaneous Transference 【SCC +缩点 + SPFA】
Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6204 Accep ...
- POJ 3592 Instantaneous Transference(强联通分量 Tarjan)
http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...
- poj 3592 Instantaneous Transference 缩点+最长路
题目链接 给一个n*m的图, 从0, 0这个点开始走,只能向右和向下. 图中有的格子有值, 求能获得的最大值. 其中有些格子可以传送到另外的格子, 有些格子不可以走. 将图中的每一个格子都看成一个点, ...
- POJ3592 Instantaneous Transference tarjan +spfa
链接:http://poj.org/problem?id=3592 题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队# ...
- Instantaneous Transference(强连通分量及其缩点)
http://poj.org/problem?id=3592 题意:给出一个n*m的矩阵,左上角代表起始点,每个格子都有一定价值的金矿,其中‘#’代表岩石不可达,‘*’代表时空门可以到达指定格子,求出 ...
- POJ3592 Instantaneous Transference 强连通+最长路
题目链接: id=3592">poj3592 题意: 给出一幅n X m的二维地图,每一个格子可能是矿区,障碍,或者传送点 用不同的字符表示: 有一辆矿车从地图的左上角(0,0)出发, ...
- POJ3592 Instantaneous Transference题解
题意: 给一个矩形,矩形中某些点有一定数量的矿石,有些点为传送点,有些点为障碍.你驾驶采矿车(ore-miner truck,我也不知道是什么),从左上角出发,采尽量多的矿石,矿石不可再生.不能往左边 ...
- poj 3592 缩点+SPFA
题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...
随机推荐
- php中应该哪怕被打断腿都要记得的几个函数
php中应该哪怕被打断腿都要记得的几个函数: substr() 截取字符串 : explode() 使用一个字符串分割另一个字符串 : implode() 将数组用预定的字符连接成字符串: 下面有一个 ...
- Thread Join()的用法
Java Thread类有个 join() 方法,先前一直不知道是怎么用的,直到看到这篇文章.http://auguslee.iteye.com/blog/1292203 Java Thread中, ...
- Android开发系列(一)Activity与Fragment获取屏幕获取屏幕像素的不同方式
Activity中常用的获取屏幕像素代码: //获取屏幕像素相关信息 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getD ...
- 模板-->扩展欧几里得
如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 单变元模线性方程模板 poj_2115_C Looooops,my_ac_code 简单的测试 None 代码模板 /* ...
- NYOJ2括号配对问题
括号配对是最基本的栈的问题,它是栈入门的经典题目,思路是,如果是左括号直接进栈,如果是右括号,这时就要比较栈顶的元素与他是否匹配,如果匹配则出栈,否则进栈,下面是代码的实现: #include < ...
- centos7.2下安装mysql5.7,使用rpm包安装
0.环境 本文操作系统: CentOS 7.2.1511 x86_64 MySQL 版本: 5.7.16 1.卸载系统自带的 mariadb-lib[root@centos-linux ~]# rpm ...
- 如何在ASP.NET端获取屏幕宽度
using System.Windows.Forms; 首先引用上面的命名空间. 然后在代码中获取屏幕信息.如下代码: System.Windows.Forms.Screen screen = Sys ...
- 在ssh框架中注解方式需要注意的几个问题
1.注解方式的时候 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get ...
- iOS 使用xmpp做聊天客户端
可以号称史上最详细的xmpp做iOS客户端聊天介绍. 简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMP ...
- 为你的网页中添加一些空格
在上一节的例子,我们已经讲解过在html代码中输入空格.回车都是没有作用的.要想输入空格,必须写入 . 语法: 在html代码中输入空格是不起作用的,如下代码. 在浏览中显示,还是没有空格效果. ...