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的更多相关文章

  1. POJ 3592 Instantaneous Transference(强连通+DP)

    POJ 3592 Instantaneous Transference 题目链接 题意:一个图.能往右和下走,然后有*能够传送到一个位置.'#'不能走.走过一个点能够获得该点上面的数字值,问最大能获得 ...

  2. poj 3592 Instantaneous Transference 【SCC +缩点 + SPFA】

    Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6204   Accep ...

  3. POJ 3592 Instantaneous Transference(强联通分量 Tarjan)

    http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...

  4. poj 3592 Instantaneous Transference 缩点+最长路

    题目链接 给一个n*m的图, 从0, 0这个点开始走,只能向右和向下. 图中有的格子有值, 求能获得的最大值. 其中有些格子可以传送到另外的格子, 有些格子不可以走. 将图中的每一个格子都看成一个点, ...

  5. POJ3592 Instantaneous Transference tarjan +spfa

    链接:http://poj.org/problem?id=3592 题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队# ...

  6. Instantaneous Transference(强连通分量及其缩点)

    http://poj.org/problem?id=3592 题意:给出一个n*m的矩阵,左上角代表起始点,每个格子都有一定价值的金矿,其中‘#’代表岩石不可达,‘*’代表时空门可以到达指定格子,求出 ...

  7. POJ3592 Instantaneous Transference 强连通+最长路

    题目链接: id=3592">poj3592 题意: 给出一幅n X m的二维地图,每一个格子可能是矿区,障碍,或者传送点 用不同的字符表示: 有一辆矿车从地图的左上角(0,0)出发, ...

  8. POJ3592 Instantaneous Transference题解

    题意: 给一个矩形,矩形中某些点有一定数量的矿石,有些点为传送点,有些点为障碍.你驾驶采矿车(ore-miner truck,我也不知道是什么),从左上角出发,采尽量多的矿石,矿石不可再生.不能往左边 ...

  9. poj 3592 缩点+SPFA

    题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...

随机推荐

  1. SVN server的搭建

    当做大的项目是,svn是代码管理的好工具,假设是用自己的server,那么须要搭建SVNserver. Subversion是一款很优秀的svnserver工具,笔者採用VisualSVN serve ...

  2. MYSQL 体系结构图-log (踏雪无痕) (UC技术博客)

    http://www.cnblogs.com/chenpingzhao/category/690116.html http://www.cnblogs.com/chenpingzhao/p/51074 ...

  3. linux安装tomcat(转载:http://blog.csdn.net/zhuihunmiling/article/details/8977387)

    在安装Tomcat之前需要安装j2sdk(Java 2 Software Development Kit),也就是JDK 1.安装JDK完毕. 2.安装Tomcat 1)下载apache-tomcat ...

  4. 初步学习vue.js

    vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 响应的数据绑定 Vue.js 的核心是一个响应的数据绑定系统,它让数据与 DOM 保持同 ...

  5. Linux磁盘管理:lvcreate 常用命令

    查看当前LV及PV信息: [root@rusky ~]# hostnamectl Static hostname: localhost.localdomain Transient hostname: ...

  6. QT pro文件解析

    在QT中使用qmake自动生成pro文件,如果要自己定制工程选项,则需要自行修改pro文件. pro文件有以下关键字:TEMPLATE.TARGET.DESTDIR.DEPENDPATH.INCLUD ...

  7. Android Studio中关于Project与Module

    在Android Studio中一个Project和Eclipse中的WorkSpace是相似的,而一个Module与Eclipse中的Project是相似的(大致可以这么的认为) 若在Android ...

  8. jquery获取value值

    $(function(){ alert(1); var a=$("#a004").val(); var a1=$("#b004").val(); //.val就 ...

  9. 登录模块需要用到session留底

    <% HttpSession sessions=request.getSession(); Object sessionValues=sessions.getAttribute("ui ...

  10. javadoc in archive eclipse.

    Open Windows -> Preferences. 2.Select jre from Installed JREs then hit Edit botton on the right. ...