他可以多次路过不进,但进的话只能进一次。flymouse走到头,求他能得到的最大值
思路:因为有环,所以进行缩点 构建新图 但新的图可能有多个入度出度为0的点,如果用枚举的话 时间可能会超
可以建立一个超级源点,把所有入度为0的点连起来,然后求src到 出度为0的点中值最大的就OK
#include <stdio.h>
#include <string.h>
#define VM 30005
#define EM 150050
int
val[VM],newval[VM],head[VM],head1[VM],p,n;//val[]是原点的值,newval是缩点的点的值
int vis[VM],belong[VM],dfn[VM],low[VM],stack[VM];
//这是tarjan的常用数组变量
int indeg[VM],outdeg[VM];
int scc,top,cnt,src = 0;
struct E
{
to,next;
}edge[EM];
struct E1
{
to,next,cost;
}edge1[EM];//新图
void addedge (int cu,int cv)
{
cv;
= head[cu];
++;
}
void addedge1 (int cu,int cv,int cw)
{
= cv;
edge1[p].cost = cw;
edge1[p].next = head1[cu];
p ++;
}
void tarjan (int
u)
//tarjan算法缩点
{
low[u] = ++cnt;
= u;
1;
head[u];i != -1;i = edge[i].next)
v = edge[i].to;
if (!dfn[v])
{
tarjan(v);
low[u] = low[u] < low[v]?low[u]:low[v];
}
else if (vis[v]&& low[u]
> dfn[v])
low[u] = dfn[v];
== low[u])
++scc;
do
{
v = stack[--top];
vis[v] = 0;
belong[v] = scc;
}while (u != v);
}
void sovle ()
{
cnt = 0;
(vis,0,sizeof(vis));
(dfn,0,sizeof(dfn));
1;u <= n;u ++)
if (!dfn[u])
tarjan(u);
}
void new_graph()
{
u,v,i;
(newval,0,sizeof(newval));
(indeg,0,sizeof(indeg));
(outdeg,0,sizeof(outdeg));
<= n;u ++)