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. AngularJs--过滤器(filter)

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...

  2. iphone开发第一个UI应用程序QQ

    #import <UIKit/UIKit.h> @interface HViewController : UIViewController @property (retain, nonat ...

  3. OFBIZ bug_ControlServlet.java:239:ERROR

    错误日志: [java] 2014-09-23 00:11:34,877 (http-bio-0.0.0.0-8080-exec-4) [ ControlServlet.java:141:INFO ] ...

  4. 【WS-Federation】到底有多少公司在用WS-Federation

    到底有多少公司在用WS-Federation? sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token, ...

  5. 微软职位内部推荐-Senior SDE for Cloud Platform

    微软近期Open的职位: Microsoft Launched the public cloud service-Azure in China on May 2013, Cosmos is the k ...

  6. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  7. ExtJs 4.2.1 复选框数据项动态加载(更新一下)

    最近在做博客项目,后台管理用的是ExtJs4.2.1版本,因为是初学所以在使用的时候也遇到不少的这样或那样的问题,也写了不少这方面的博客,今天要写的博客是关于复选框数据项动态的加载功能,以前也没用过, ...

  8. String类中的equals()方法

    在Java中,每一个对象都有一个地址空间,在这空间保存着这个对象的值. equals 比较的是值,==比较的地址以及值. 01: public class StringExample02: {03: ...

  9. NodeJS用递归实现异步操作的链式调用,完成一个简易的命令行输入输出REPL交互接口

    REPL —— Read-Eval-Print-Loop. 00.一门好的编程语言的必要条件 REPL并不是什么高大上的东西,简单的说就是一个从命令行程序,读取终端输入,处理,打印结果,如此循环.这是 ...

  10. 使用eclipse生成文档(javadoc)

    使用eclipse生成文档(javadoc)主要有三种方法:1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步.在Java ...