? Acwing 178 && POJ 2449 ?
2021-02-01 02:17
标签:srm 连通 cpp 算法 text size operator dfs 是的 学习算法的日子又到了~~ 提供以下几种方法 暴搜 输出 \(A^\ast\) 下面直接进行\(A^\ast\)的讲解 所以,发现想出\(f\)很关键,,\(f\)要尽量大但不超过最优解 第几次出队就是第几短,于是终点出了\(k\)次就是第\(k\)短路了 按照\(Dijkstra\)的思想,我们每次取出\(d[x]+f[x]\) 最小的 然后更新所有能到达的点 发现\(f[x]\) 可以取到终点的距离,这样尽量大且一定比现在的解小 于是先倒着\(Dijkstra\)一遍(搞出\(f\)) 然后\(A^ \ast\),直到终点第\(k\)次。 \(OK\),上代码 \[
The \quad End
\] \[
\text{从白云看到,不见蓝天;从风雨寻回,梦的起点。-《梦想天空分外蓝》陈奕迅}
\] ? Acwing 178 && POJ 2449 ? 标签:srm 连通 cpp 算法 text size operator dfs 是的 原文地址:https://www.cnblogs.com/cbyyc/p/11601316.html写在前面
Idea?
-1
(是的,输出-1
)
Code?
Code1
//Dijstra 暴力版
const int maxx=1001;
struct Node{
int v,to,next;
}e[maxn >q;
inline void add(int x,int y,int z){
e[++tot].v=y; e[tot].to=z;
e[tot].next=head[x]; head[x]=tot;
}
inline bool dfs(int x){
if(x==T) return true;
vis[x]=true;
for(int i=head[x];i;i=e[i].next){
int y=e[i].v;
if(!vis[y]) if(dfs(y)==true)
return true;
}
return false;
}
inline void dijkstra(){
if(!dfs(S)){puts("-1");return;}
q.push(make_pair(0,S));
if(S==T) v=-1;
while(q.size()){
int d=q.top().first,x=q.top().second; q.pop();
if(x==T){
if(++v==K){printf("%d",-d);return;}
len=0;
}
else if(++len==maxx*15)break;//防止搜过多
for(int i=head[x];i;i=e[i].next){
int y=e[i].v;
q.push(make_pair(d-e[i].to,y));
}
}
puts("-1");
}
signed main(){
n=read(); m=read();
for(int i=1;i
Code2
//Dijkstra + A*
const int maxx=1001;
struct Node{
int y,to,next;
}e[maxn],e1[maxn];
int head[maxx],tot,head1[maxx],cnt;//head1为反向边
int n,m,dis[maxx],S,T,K,vis[maxx];
inline void add(int x,int y,int z){
e[++tot]=(Node){y,z,head[x]};
head[x]=tot;
}
inline void add1(int x,int y,int z){//反边
e1[++cnt]=(Node){y,z,head1[x]};
head1[x]=cnt;
}
priority_queue
Code3
//给出同学的 SPFA + A*,喜欢用spfa的同学可以看一眼
const int N=100010;
int tot,tc,n,m,s,t,k,x,y,l;
int lin[N],linc[N],vis[N],f[N];
struct gg {
int x,y,next,v;
}a[N],e[N];
struct node {
int pos,f,dis;
bool operator q;
memset(f,0x3f,sizeof(f));
memset(vis,0,sizeof(vis));
q.push(t); f[t]=0; vis[t]=1;
while(q.size()) {
int x=q.front(); q.pop(); vis[x]=0;
for(int i=lin[x];i;i=a[i].next) {
int y=a[i].y;
if(f[y]>f[x]+a[i].v) {
f[y]=f[x]+a[i].v;
if(!vis[y]) {
vis[y]=1;
q.push(y);
}
}
}
}
}
priority_queue
文章标题:? Acwing 178 && POJ 2449 ?
文章链接:http://soscw.com/index.php/essay/49312.html