POJ3592 Instantaneous Transference tarjan +spfa
链接:http://poj.org/problem?id=3592
题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队#外,每个点只能向右走或向下走,并且可以反复经过一个点。如今请求得最多可以获得多大好处 。
一开始看到这个题,会以为是费用流。但是计划上是在tarjan上的。我觉得如果比赛的时候有这道题估计我也就挂了。
因为这个图大部分的点只有两个后续节点, 但是*会有更多的节点,所以说这样会产生环,因此可以吧整个图求强连通进行缩点,因为每个强连通分量重的点你是可以得到她所有的值。不管走几次,就是那么多,缩完点之后就可以构成DAG这样,就能够求出从belong[1]出发得到的最远的点。一开始逗比了,忘了出发点是左上角,而且dis的赋初值写错了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define loop(s,i,n) for(i = s;i < n;i++)
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = ;
struct edge
{
int u,v,val,next;
}; char map[][];
int dfn[maxn],low[maxn],belong[maxn],inst[maxn];
int head[maxn];
vector<edge>edges,es;
int ihead[maxn];
stack<int> st;
int vis[maxn],dis[maxn];
int dfsclock,scc,cnt;
vector<int>trans;
void init(int n)
{
int i;
loop(,i,n+)
head[i] = -; edges.clear();
es.clear();
dfsclock = scc = cnt = ;
trans.clear();
return ;
}
void addedge(int u,int v,int val)
{
int m;
struct edge e;
e.u = u;
e.v = v;
e.next = head[u];
edges.push_back(e);
m = edges.size();
head[u] = m-;
return ;
}
void tarjan(int i)
{
dfn[i] = low[i] = ++dfsclock;
inst[i] = ;
st.push(i); int j;
edge e;
for(j = head[i]; j != -; j = e.next)
{ e = edges[j];
int v;
v = e.v;
if(!dfn[v])
{
tarjan(v);
low[i] = min(low[v],low[i]);
}
else if(inst[v] && dfn[v] < low[i])
low[i] = dfn[v];
} if(dfn[i] == low[i])
{
scc++;
do
{
j = st.top();
st.pop();
inst[j] = ;
belong[j] = scc;
}
while(i != j);
}
}
void tarjans(int n)
{
dfsclock = scc = ;
memset(dfn,,sizeof(dfn));
while(!st.empty())st.pop(); cl(inst,);
cl(belong,);
int i;
loop(,i,n+)
{
if(!dfn[i]) tarjan(i);
}
return ;
}
int spfa(int s,int n)
{
int i,j;
dis[s] = ;
queue<int>q;
q.push(s);
vis[s] = ;
while(!q.empty())
{
int x;
x = q.front(); q.pop();
vis[x] = ;
struct edge e;
for(i = ihead[x]; i != -; i = e.next)
{
int v; e = es[i];
v = e.v;
if(dis[v] < dis[x]+e.val)
{
dis[v] = dis[x]+e.val;
q.push(v);
vis[v] = ;
}
}
}
int max = ;
for(i = ; i <= n; i++)
{
if(dis[i] > max)
max = dis[i];
} return max;
}
int val[maxn];
int main()
{
int t;
int n,m,k;
scanf("%d",&t);
while(t--)
{
int i,j;
int p;
p = ;
scanf("%d %d",&n,&m);
init(n*m+);
loop(,i,n)
scanf("%s",map[i]);
int leap = ;
for(i = ; i < n; i++)
{
for(j = ; j < m; j++)
{
if(map[i][j] == '*')
trans.push_back(i*m+j+);
}
} loop(,i,trans.size())
{
int l,r;
scanf("%d %d",&l,&r);
if(map[l][r] == '*')
addedge(trans[i],l*m+r+,);
else if(map[l][r] != '#')
addedge(trans[i],l*m+r+,map[l][r]-'');
} loop(,i,n)
{
loop(,j,m)
{
if(map[i][j] != '#')
{ if(i+ < n && map[i+][j] == '*')
addedge(i*m+j+,(+i)*m+j+,);
else if(i+ < n && map[i+][j] != '#')
addedge(i*m+j+,(+i)*m+j+,+map[i+][j]-''); if(j+ < m && map[i][j+] == '*' )
addedge(i*m+j+,(i)*m++j,);
else if( j+ < m && map[i][j+] != '#')
addedge(i*m+j+,i*m+j+,map[i][j+]-'');
}
}
} tarjans(m*n);
// cout<<scc<<endl;
cl(val,); int sum;
sum = ;
cl(vis,);
memset(ihead,-,sizeof(ihead));
for(i = ; i <= m*n; i++)
{
int r,l;
r = (i-)/m;
l = (i-)%m;
if(map[r][l] != '#' && map[r][l] != '*')
val[belong[i]] += map[r][l] - '';
} for(i = ; i < edges.size(); i++)
{
int u,v;
u = edges[i].u;
v = edges[i].v;
if(belong[u] != belong[v])
{
u = belong[u];
v = belong[v];
struct edge e;
e.u = u;
e.v = v;
e.val = val[v];
e.next = ihead[u];
es.push_back(e);
int m;
m = es.size();
ihead[u] = m-;
}
} cl(vis,);
cl(dis,-);
int ans; if(scc == )
printf("%d\n",val[belong[]]);
else
{
ans = ;
int ansi;
ans = spfa(belong[],scc);
printf("%d\n",ans+val[belong[]]);
} }
return ;
}
POJ3592 Instantaneous Transference tarjan +spfa的更多相关文章
- poj3592 Instantaneous Transference tarjan缩点+建图
//给一个n*m的地图.坦克从(0 , 0)開始走 //#表示墙不能走,*表示传送门能够传送到指定地方,能够选择也能够选择不传送 //数字表示该格的矿石数, //坦克从(0,0)開始走.仅仅能往右和往 ...
- POJ3592 Instantaneous Transference 强连通+最长路
题目链接: id=3592">poj3592 题意: 给出一幅n X m的二维地图,每一个格子可能是矿区,障碍,或者传送点 用不同的字符表示: 有一辆矿车从地图的左上角(0,0)出发, ...
- POJ3592 Instantaneous Transference题解
题意: 给一个矩形,矩形中某些点有一定数量的矿石,有些点为传送点,有些点为障碍.你驾驶采矿车(ore-miner truck,我也不知道是什么),从左上角出发,采尽量多的矿石,矿石不可再生.不能往左边 ...
- poj 3592 Instantaneous Transference 【SCC +缩点 + SPFA】
Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6204 Accep ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)
显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...
- POJ 3592 Instantaneous Transference(强连通+DP)
POJ 3592 Instantaneous Transference 题目链接 题意:一个图.能往右和下走,然后有*能够传送到一个位置.'#'不能走.走过一个点能够获得该点上面的数字值,问最大能获得 ...
- poj3592Instantaneous Transference(tarjan+spfa)
http://poj.org/problem?id=3592提交了30多次了 受不了了 两份的代码基本上一样了 一个AC一个WA 木办法 贴份别人的吧 改得跟我得一样 人家能A 我是WA.. 强连通 ...
- POJ 3592 Instantaneous Transference(强联通分量 Tarjan)
http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...
随机推荐
- Hadoop 系统配置 map 100% reduce 0%
之前在本地配置了hadoop伪分布模式,hdfs用起来没问题,mapreduce的单机模式也没问题. 今天写了个程序,想在伪分布式上跑一下mapreduce,结果出现 map 100% reduce ...
- 安装wine qq2012
添加软件源:vi /etc/apt/sources.list deb http://http.kali.org/kali kali main non-free contribdeb-src http: ...
- HDU 4588 Count The Carries(找规律,模拟)
题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...
- 思考 ”前端开发人员都在关注的 GitHub 资源“
点这里 原文: 资源 免费的计算机编程类中文书籍 免费编程书籍 计算机科学论文 codeparkshare Python初学者书籍.视频.资料.社区推荐 Python资料汇总 app应用推荐 码农周刊 ...
- ***Xcode Interface Builder或Storyboard中可建立那两种连接?
在Xcode Interface Builder或Storyboard中,可建立到输出口(IBOutlet)和操作(方法,IBAction)的连接. IBOutlet are for output C ...
- XCODE快捷键个人总结
1.在方法名上用CMD+左键 可以查看完整的方法名
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- 小鲜肉初学JS做得仿京东淘宝竖排二级导航
<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...
- 快速创建maven 工程:simple java工程,webapp
http://www.cnblogs.com/buhaiqing/archive/2012/11/04/2754187.html 会从maven的Repository里查找所有支持的arche typ ...
- Java-数据结构与算法-二分查找法
1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...