从1号点开始搜,没走过的边就走继续搜下去,回溯的时候就更新走完当前边的最小烦躁值。
这样复杂度应该是O(m)(每条边仅搜过一次)
请问问什么会超时呢(85pts)?蒟蒻求助qwq
蒟蒻的关键代码:
void dfs(int x,int dfn,int id) { //当前点,当前时间,走到当前点的边的编号
if(vis[id]) return; //如果当前边搜过了就return
for(int i=h[x];i;i=e[i].nex) {
int y=e[i].to;
if(dfn<=e[i].v1) { //如果时间不矛盾的话
if(y==n) f[i]=e[i].v2;
else dfs(y,e[i].v2,i);
}
}
for(int i=h[x];i;i=e[i].nex) //回溯更新
if(dfn<=e[i].v1)
f[id]=min(f[id],f[i]+cal(e[i].v1-dfn));
vis[id]=1; //标记当前边已经搜过
}