二分+SPFA,50pts求助(马蜂良好,敬请指教)
查看原帖
二分+SPFA,50pts求助(马蜂良好,敬请指教)
1268524
DX3906_ourstar楼主2024/8/2 19:15

二分,我的命中宿敌……

代码:

#include<iostream>
#include<queue>
#include<cstring>
#define re register
#define INF 0x3f3f3f3f
using namespace std;

const int N = 1e6 + 5;

int head[N],dis[N];
int n,m,s,t,cnt;
bool flag;

struct edge{
	int v,w,next;
}e[N];

inline void add(int u,int v,int w){
	cnt ++;
	e[cnt].v = v;
	e[cnt].w = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}

inline void SPFA(int mid){
    queue<int> q;
    q.push(s);
    dis[s] = 1;
    while(! q.empty()){
        int u = q.front();
		q.pop();
        for(int i = head[u];i != -1;i = e[i].next){
        	int v = e[i].v;
			if(e[i].w <= mid){
            	if (dis[v] == INF){
                	dis[v] = 1;
            	    q.push(v);
            	}
        	}
		}
    }
    if(dis[t] == INF){
    	flag = false;
	}
    else{
    	flag = true;
	}
}

inline void cs(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	memset(dis,0x3f,sizeof(dis));
	memset(head,-1,sizeof(head));
}

int main(){
	cs();
	cin>>n>>m>>s>>t;
    for(re int i = 1;i <= m;i ++){
		int u,v,w;
		cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    int l = 0,r = 10000;
    while(l < r){
        int mid = (r - l) / 2 + l;
        SPFA(mid);
        if(flag){
        	r = mid;
		}else{
        	l = mid + 1;
		}
    }
	cout<<l<<"\n";
	return 0;
}

题外话:坏人为啥把小明弄到警车上?

2024/8/2 19:15
加载中...