• 牛客练习赛105 D.点分治分点(spfa&bfs)


    牛客练习赛105 D.点分治分点(spfa&bfs)

    最小路径最大化,这个状态是可以类似spfa or dijkstra转移的。

    对于结点 u u u 连接的结点 v v v

    if(dis[v]<min(dis[u],w)){
        dis[v] = min(dis[u],w);
    }
    
    • 1
    • 2
    • 3

    显然这样更新是对的,因为如果w

    时间复杂度: O ( m l o g n ) O(mlogn) O(mlogn)

    spfa版

    #include
    using namespace std;
    
    #define add(x,y,z) G[x].push_back({y,z});
    typedef pair<int,int> pa;
    const int MAXN=1e5+5;
    vector<pa>G[MAXN];
    int dis[MAXN];
    bool vis[MAXN];
    void spfa(int s)
    {
        queue<int>q;
        memset(dis,-1,sizeof(dis));
        q.push(s),vis[s]=1,dis[s]=0x3f3f3f3f;
        while(!q.empty())
        {
            int x=q.front();q.pop();
            vis[x]=0;
            for(auto [y,z]:G[x])
                if(dis[y]<min(dis[x],z))
                {
                    dis[y]=min(dis[x],z);
                    if(!vis[y]) q.push(y),vis[y]=0;
                }
        }
    }
    int main()
    {
        int n,m,s;
        cin>>n>>m>>s;
        int u,v,w;
        for(int i=1;i<=m;++i)
        {
            scanf("%d %d %d",&u,&v,&w);
            if(u!=v) add(u,v,w);
        }
        spfa(s);
        for(int i=1;i<=n;++i) printf("%d ",dis[i]==0x3f3f3f3f?-1:dis[i]);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    dijkstra版

    #include 
    using namespace std;
    typedef long long ll;
    
    int i,j,k,n,m,t,st,res[100500];
    vector<pair<int,int>> v[100500];
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin>>n>>m>>st;
    	memset(res,-1,sizeof(res));
    	for(i=1;i<=m;i++){
    		cin>>j>>k>>t;
    		if(k!=st)v[j].push_back({k,t});
    	}
    	priority_queue<pair<int,int> >q;
    	for(auto [i,j]:v[st])q.push({j,i});
    	while(!q.empty()){
    		auto [w,id]=q.top();q.pop();
    		if(res[id]!=-1)continue;
    		res[id]=w;
    		for(auto [i,j]:v[id]){
    			if(res[i]!=-1)continue;
    			q.push({min(w,j),i});
    		}
    	}
    	for(i=1;i<=n;i++)cout<<res[i]<<' ';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    以智能化为舵手,引领现代计算机系统架构新航向
    Java面试题之并发
    超大文本查看器
    方法的重载
    在MySQL中使用VARCHAR字段进行日期筛选
    这款微信插件太好用了
    Arthas(2):使用Web Console
    2023/10/25
    Git分支&标签
    【深度学习】学习案例:Keras 多层感知器手写数字识别
  • 原文地址:https://blog.csdn.net/weixin_45750972/article/details/127718731