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. Ecshop实现仿Taobao地区运费模板

    目录: 1.Ecshop后台配送方式创建 2.商品绑定配送方式的运费模板 2.1 数据表“ecs_goods”增加一个字段,执行下面SQL语句: 2.2 后台添加/编辑 商品 调出已经安装配送方式 & ...

  2. 64位Python安装PIL

    写个小程序需要安装PIL,但是官网只有32位,无法找到64位安装路径.根据网上教程自行编译,但是由于VS版本问题总是提示“Python error: Unable to find vcvarsall. ...

  3. 开博第一篇:DHT 爬虫的学习记录

    经过一段时间的研究和学习,大致了解了DHT网络的一些信息,大部分还是参会别人的相关代码,一方面主要对DHT爬虫原理感兴趣,最主要的是为了学习python,大部分是别人的东西原理还是引用别人的吧 DHT ...

  4. 别让emacs损伤你的小母指

    刚接触emacs时感觉,这东西怎么这么难用,还说是编辑器的神,我去. 写个代码跟挫游戏机手柄似的,关键是还这么难挫,平时用的最多的左ctrl键,这么难按,可怜的我的小母指(Petyr Baelish) ...

  5. splObjectStroge的作用,实例化一个数组

    PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...

  6. Oracle监听器—静态注册

    注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 注册分: 1. 静 ...

  7. 【非原】c语言之声明和定义的区别

    原创地址:http://www.cnblogs.com/haore147/p/3647466.html 什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern  ...

  8. 如何应用CLR线程池来管理多线程

        class Program     {         static void Main(string[] args)         {             int intWorkerT ...

  9. SQL 去除重复、获取最新记录

    应用中常会有需要去除重复的记录,或者获取某些最新记录(如:每个用户可以答题多次,每次答题时间不同,现在要获取所有用户的最新答题记录,即每个用户取最新的一条) 使用group 和max 即可实现上述功能 ...

  10. linux命令useradd添加用户详解

    1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s shell] [-c comment] [ ...