为啥dfs不太行但是bfs可以呢?
查看原帖
为啥dfs不太行但是bfs可以呢?
214853
Mecci_miaowu楼主2021/5/19 22:51

#3 TLE && #6 WA

#include<bits/stdc++.h>
#define gc() getchar()
#define reg register
using namespace std;
typedef long long ll;
inline ll read(){
	reg ll res=0,k=1;
	reg char ch = gc();
	while(ch < '0'||ch > '9'){
		if(ch == '-')k=-1;
		ch = gc();
	}
	while(ch >= '0'&&ch <= '9'){
		res = res*10+ch-'0';
		ch = gc();
	}
	return res*k;
}

int n, m, k;
struct edge{int s, e, v, next;}eg[1005 * 2];
int head[55];
int cnt;
inline void make(reg int s, reg int e, reg int v){
	eg[++cnt] = {s, e, v, head[s]};
	head[s] = cnt;
}

ll dis[55][55];

inline void dfs(reg int id, reg int use, reg int step){
	if(step >= dis[id][use])return;
	dis[id][use] = step;
	for(reg int i = head[id] ; i ; i = eg[i].next){
		dfs(eg[i].e, use, dis[id][use] + eg[i].v);
		if(use + 1 <= k)dfs(eg[i].e, use + 1 , dis[id][use] + eg[i].v/2);
	}
}

struct Node{int id, use, step;};
inline void bfs(){
	dis[1][0] = 0;
	queue <Node> q;
	q.push((Node){1, 0, 0});
	while(!q.empty()){
		Node t = q.front();
		q.pop();
		for(reg int i = head[t.id] ; i ; i = eg[i].next){
			if(t.step + eg[i].v < dis[eg[i].e][t.use]){
				dis[eg[i].e][t.use] = t.step + eg[i].v;
				q.push((Node){eg[i].e, t.use, dis[eg[i].e][t.use]});
			}
			if(t.use + 1 <= k && t.step + eg[i].v / 2 < dis[eg[i].e][t.use + 1]){
				dis[eg[i].e][t.use + 1] = t.step + eg[i].v / 2;
				q.push((Node){eg[i].e, t.use + 1, dis[eg[i].e][t.use + 1]});
			}
		}
	}
}

int main(){
	memset(dis, 0x7f, sizeof(dis));
	n = read(), m = read(), k = read();
	for(reg int i = 1 ; i <= m ; ++i){
		reg int s = read(), e = read(), v = read();
		make(s, e, v);
		make(e, s, v);
	}
	bfs();
   //dfs(1, 0, 0)
	ll ans = 0x7fffffff;
	for(int i = 0 ; i <= k ; ++i)
		ans = min(ans,dis[n][i]);
	printf("%lld\n", ans);
	return 0;
}
2021/5/19 22:51
加载中...