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. 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS2\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files”的写访问权限。

    卸载了域控制器之后,IIS出现“当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS2\Microsoft.NET\Framework\v4.0.30319 ...

  2. 怎样下载安装Firebug和使用Firebug

    Firebug是基于火狐(FireFox)浏览器的一个插件,它的作用是给Web页面开发者一个很好的测试前端页面代码的工具.所以深受网页开发者或网页布局爱好者的喜爱.像我们用DIV+CSS和html所写 ...

  3. 在ubuntu下给eclipse创建桌面快捷方式

    在桌面进行编辑 编辑eclipse.desktop [Desktop Entry] Encoding=UTF-8 Name=Eclipse Platform Comment=Eclipse IDE E ...

  4. raise_application_error用法

    我们经常通过dbms_output.put_line来输出异常信息,但有时需要把异常信息返回给调用的客户端.此时我们用raise_application_error,允许用户在pl/sql中返回用户自 ...

  5. oracle的function和procedure返回值给shell

    本文演示两个关于如何在shell中调用oracle的function和procedure,并将返回值返回给shell. 1.首在package中创建function和procedure,脚本如下: G ...

  6. easy ui 表单提交添加遮罩,避免数据重复提交

    如下图: //点击提交按钮保存数据 $('#btn_submit').click(function () { //增加遮罩层 $.messager.progress({ title: '温馨提示', ...

  7. IOS9中出现的错误

    1,Bitcode 错误提示: ld: '/Applications/Cocos/frameworks/cocos2d-x-3.8.1/prebuilt/ios/libcocos2d iOS.a(CC ...

  8. speed up your sharepoint

    1. warm up http://blog.nowan.hu/post/SPWakeUp-Wake-up-your-SharePoint-quickly http://blogs.msdn.com/ ...

  9. Timeline

    Timeline面板   Chrome开发者工具详解(3)-Timeline面板 注: 这一篇主要讲解面板Timeline,参考了Google的相关文档,主要用于公司内部技术分享.. 更新时间:201 ...

  10. ExtJS4.2学习(六)表格分页与通过后台脚本获得分页数据

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-12/175.html --------------- ...