http://poj.org/problem?id=3592提交了30多次了 受不了了 两份的代码基本上一样了 一个AC一个WA 木办法 贴份别人的吧 改得跟我得一样 人家能A  我是WA。。

强连通分量缩点 用spfa算出最长路 注意算强连通时加过的值就不再加了

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
#include<stack>
using namespace std;
const int NN=;
const int MM=;
const int INF=0x3fffffff; int n,m,w[NN],val[NN];
char c[][];
vector<int> adj[NN]; struct Edge{
int u,v,next;
}edge[MM];
int t,head[NN];
void addedge(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
} int bcnt,top,depth,dfn[NN],low[NN],belong[NN],vis[NN],instack[NN];
//bool instack[NN];
stack<int>s;
void init()
{
t=;
memset(head,-,sizeof(head));
}
void tarjan(int u)
{
dfn[u]=low[u]=++depth;
s.push(u);
instack[u] = ;
int v;
for (int i=head[u]; i!=-; i=edge[i].next)
{
v=edge[i].v;
if (!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (instack[v])
low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u])
{bcnt++;
val[bcnt] = ;
adj[bcnt].clear();
for(;;)
{
v=s.top();
s.pop();
belong[v]=bcnt;
val[bcnt]+=w[v];instack[v] = ;
if(v==u)
break;
} }
}
int dis[NN];
int lpfa(int S)
{
for (int i=; i<=bcnt; i++) dis[i]=-INF;
memset(vis,,sizeof(vis));
dis[S]=;
queue<int> q;
q.push(S);
while (!q.empty())
{
int u=q.front();
vis[u]=;
q.pop();
for (int i=; i<adj[u].size(); i++)
{
int v=adj[u][i];
if (dis[v]<dis[u]+val[v])
{
dis[v]=dis[u]+val[v];
if (!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
int ret=;
for (int i=; i<=bcnt; i++) if (dis[i]>ret) ret=dis[i];
return ret+val[S];
}
void find(int n)
{
memset(dfn,,sizeof(dfn));
memset(instack,,sizeof(instack));
memset(val,,sizeof(val));
memset(low,,sizeof(low));
bcnt=depth=;
for(int i = ; i < n ; i++)
if (!dfn[i]) tarjan(i);
}
int main()
{
int cas;
scanf("%d",&cas);
while (cas--)
{
scanf("%d%d",&n,&m);
for (int i=; i<n; i++)
{
getchar();
for (int j=; j<m; j++) c[i][j]=getchar();
}
init();
int x,y;
for (int i=; i<n; i++)
for (int j=; j<m; j++)
{
int u= i*m+j;
if (c[i][j]=='*')
{
w[u]=;
scanf("%d%d",&x,&y);
addedge(u,x*m+y);
}
else w[u]=c[i][j]-'';
if (c[i][j]=='#') { w[u]=; continue; }
if (i!=n- && c[i+][j]!='#') addedge(u,u+m);
if (j!=m- && c[i][j+]!='#') addedge(u,u+);
}
find(n*m);
int u,v;
for (int i=; i<t; i++)
{
u=edge[i].u; v=edge[i].v;
if (belong[u]!=belong[v]) adj[belong[u]].push_back(belong[v]);
}
printf("%d\n",lpfa(belong[]));
}
return ;
}

poj3592Instantaneous Transference(tarjan+spfa)的更多相关文章

  1. 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...

  2. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  3. tarjan讲解(用codevs1332(tarjan的裸题)讲解)

    主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...

  4. 浅析强连通分量(Tarjan和kosaraju)

    理解   在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次.     ...

  5. 6101 最优贸易 (双向spfa)

    描述C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的 ...

  6. 【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)

    [BZOJ4331][JSOI2012]越狱老虎桥(Tarjan) 题面 BZOJ 然而BZOJ是权限题QwQ 洛谷 题解 先求出所有割边,那么显然要割掉一条割边. 如果要加入一条边,那么显然是把若干 ...

  7. 【BZOJ5303】[HAOI2018]反色游戏(Tarjan,线性基)

    [BZOJ5303][HAOI2018]反色游戏(Tarjan,线性基) 题面 BZOJ 洛谷 题解 把所有点全部看成一个\(01\)串,那么每次选择一条边意味着在这个\(01\)串的基础上异或上一个 ...

  8. 【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)

    [BZOJ4784][ZJOI2017]仙人掌(Tarjan,动态规划) 题面 BZOJ 洛谷 题解 显然如果原图不是仙人掌就无解. 如果原图是仙人掌,显然就是把环上的边给去掉,变成若干森林连边成为仙 ...

  9. 【BZOJ2208】[JSOI2010]连通数(Tarjan)

    [BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> ...

随机推荐

  1. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)

    iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...

  2. C#实现网络传输数据加密

    1. 分组密码 分组密码是将明文消息编码表示后数字序列划分成长为n的分组,各组分别在密钥的作用下进行变换输出等长的数字序列,即密文.一次加密一个数据组,加解密所使用的是同一密钥,故其通常也称为对称加密 ...

  3. 几种placeholder替换项目参数的方法比较

    引言:(引自:http://openwebx.org/docs/autoconfig.html) 在一个应用中,我们总是会遇到一些参数,例如: 数据库服务器IP地址.端口.用户名: 用来保存上传资料的 ...

  4. Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll

    Ever read a really long blog post or article and then had to scroll all the way up to the top of the ...

  5. PAT乙级真题1006. 换个格式输出整数 (15)(解题)

    原题: 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个 ...

  6. SPOJ 4487 Splay 基本操作

    插入操作,删除操作和置换操作都是单点的,所以不需要lazy标记.这个很简单,都是两次RotateTo,一次Splay操作就搞定. 求最大连续字段和的操作和线段树的题目类似,只需要保存最左边的连续最大字 ...

  7. iOS中touches事件,addtarget ...action和GestureRecognizer详解

    刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系 ...

  8. SC命令执行出现Access is denied

    在命令行中先是打开远程链接:net use \\computername(or ip)\ipc$ "password" /user:"[domain\]username& ...

  9. [转]StructLayout特性

    转自:http://www.cnblogs.com/JessieDong/archive/2009/07/21/1527553.html StructLayout特性 StructLayout特性   ...

  10. 2336: [HNOI2011]任务调度 - BZOJ

    一道随机算法的题目 随便用什么随机算法 首先我们可以想到枚举类型3的最终类型,然后再做 先贪心出一个较优的序列,首先我们知道肯定是在A机器上先做完类型1的事件再做类型2的事件,机器B也类似,因为这些没 ...