• 百度之星 初赛三 最短路 2 Dijkstra


    打比赛的时候切的,不过竟然 wa 了 14 次~
    挺简单的,直接在跑 $Dijkstra$ 的时候记录一下路径最大值就好了.

    #include <bits/stdc++.h>
    #define inf 100000000000000 
    #define ll long long  
    #define mod 998244353   
    #define N 1003 
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;   
    int n,m,s;     
    struct Node
    {
        int u;
        ll dis;
        Node(int u=0,ll dis=0):u(u),dis(dis){}  
        bool operator<(Node b)const
        {
            return b.dis<dis;  
        }
    }; 
    priority_queue<Node>q;    
    int hd[N],nex[N<<2],pre[N<<2],edges,done[N],to[N<<2],now[N<<2];       
    ll f[N][N],d[N];          
    ll val[N<<2];  
    inline void addedge(int u,int v,ll c)
    {
        nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c; 
    }
    inline void Dijkstra()
    {
        int i,u,v;
        for(i=1;i<=n;++i) done[i]=0;   
        for(i=0;i<=n;++i) d[i]=inf,pre[i]=0,now[i]=i;   
        d[s]=0, q.push(Node(s,0)), pre[s]=0,now[s]=0;  
        while(!q.empty())
        {
            Node e=q.top(); u=e.u,q.pop();
            if(done[u]) continue; 
            done[u]=1;        
            if(u!=s) 
            {
                now[u]=max(u, pre[u]);   
            }
            for(i=hd[u];i;i=nex[i]){
                if(d[to[i]]>=d[u]+val[i]){
                    if(d[to[i]]>d[u]+val[i]) 
                    {
                        d[to[i]]=d[u]+val[i]; 
                        pre[to[i]]=now[u];
                        q.push(Node(to[i],d[to[i]]));   
                    }
                    else {
                        if(now[u]<pre[to[i]]) pre[to[i]]=now[u];    
                      }
                }
            }
        }               
    }   
    int main() {
        setIO("input");
        using namespace IO;  
        int T; 
        scanf("%d",&T); 
        while(T--) { 
            int i,j; 
            scanf("%d%d",&n,&m); 
            edges=0; 
            for(i=1;i<=n;++i) hd[i]=0;   
            for(i=1;i<=n;++i) for(j=1;j<=n;++j) f[i][j]=inf;  
            for(i=1;i<=n;++i) f[i][i]=0; 
            for(i=1;i<=m;++i) {
                int a,b,c; 
                scanf("%d%d%d",&a,&b,&c);   
                addedge(a,b,(ll)c), addedge(b,a,(ll)c), f[a][b]=f[b][a]=min(f[a][b],(ll)c);   
            }  
            int ans=0; 
            for(i=1;i<=n;++i) { 
                s=i, Dijkstra(); 
                for(j=1;j<=n;++j) 
                     ans=(long long) (ans+pre[j])%mod;               
            } 
            printf("%d
    ",ans);   
    
        }
        return 0; 
    }
    

      

  • 相关阅读:
    poj1862---变形虫(贪心)
    poj1833---字典序算法
    poj1799---解析几何
    poj1665
    poj1663---纯粹找规律
    poj1658
    poj1657---chessboard
    poj1656---数黑格子
    poj1617---columnar encryption
    查找两个文件的相同之处,不同之处
  • 原文地址:https://www.cnblogs.com/guangheli/p/11405249.html
Copyright © 2020-2023  润新知