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. Linux分类笔记(一)-权限管理

    Linux分类笔记(一) 权限管理 普通权限 文件的普通权限 对一个普通的文件使用ls -ll命令后,看到下面的输出内容   而对于文件权限中的每一位,又分别代表了以下的意思 文件类型又有以下几类: ...

  2. C# 返回json结果集,js日期格式化

    asp.net mvc返回json结果集 return Json(new { total = totalCount, rows = result }, JsonRequestBehavior.Allo ...

  3. MVC学习系列——参考

    C#进阶系列——WebApi接口传参不再困惑:传参详解 http://www.cnblogs.com/landeanfen/p/5337072.html

  4. shell 实现word count

    awk '{arr[$2]+=$1}END{for (i in arr) print i,arr[i]}' sort_all.txt | sort -k2nr -g

  5. 怎么在SQL Server 2008中还原.mdf数据文件

    还原数据库文件的过程中,只有mdf文件,该怎么还原?在原来的SQL Server 2005中直接点击数据库然后附加就可以还原,但是在2008 版本中附加数据库文件则会出错(只有mdf文件){执行Tra ...

  6. springmvc 数据对象回绑

    springmvc中,由页面 post到 controller,对象可以在form里面设置modelAttribute达到回绑的目的. 但是如果对象里面有复杂的非String,int的对象,则要在co ...

  7. Windows2003/2008/2008 R2下易语言点支持库配置就退出的问题

    问题: 请问一个问题,我的电脑上win2003系统的,安装了易语言后,一点支持库配置就会自动退出.这是为什么啊? 解决方法如下: 删除 lib下的wmp.npk,重新打开易语言就可以了.

  8. What are the advantages of logistic regression over decision trees?FAQ

    What are the advantages of logistic regression over decision trees?FAQ The answer to "Should I ...

  9. KafkaSpout分析:配置

    public KafkaSpout(SpoutConfig spoutConf) { _spoutConfig = spoutConf;} 基于0.93版本的Storm SpoutConfig继承自K ...

  10. <Learning How to Learn>Week One: Focused versus Diffuse Thinking

    1-1 Introduction to the focused and diffuse modes (4:40) 两种思考的模式:focused mode以及diffuse mode focused ...