• 最短路径树


    最短路径树

    Define

    最短路径树即为由一个给定的点出发,到每一个点的最短路径所构成的一棵树

    求法

    在图中设置一个根节点,进行一遍 dijkstra ,在过程中就可以处理出它的一棵最短路径树

    例题

    本题只需求得所用的最短路径树的数量即可

    code
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<math.h>
    #include<vector>
    #include<queue>
    #define ll long long
    
    const ll mod=2147483647ll;
    const ll maxn=1e3+10;
    ll n,m,tot,ans=1; 
    ll head[maxn*maxn],dis[maxn],vis[maxn],num[maxn];
    struct node
    {
    	ll u,v,w,nxt;
    }s[maxn*maxn];
    
    inline void add(ll u,ll v,ll w)
    {
    	s[++tot].v=v;
    	s[tot].w=w;
    	s[tot].nxt=head[u];
    	head[u]=tot;
    }
    
    inline void dij(ll x)
    {
    	std::priority_queue<std::pair<ll,ll> > q;
    	memset(dis,0x3f,sizeof(dis));
    	memset(vis,0,sizeof(vis));
    	dis[x]=0;
    	q.push(std::make_pair(-dis[x],x));
    	
    	while(q.size())
    	{
    		ll u=q.top().second;
    		q.pop();
    		
    		if(vis[u]) continue;
    		vis[u]=1;
    		
    		for(int i=head[u];i;i=s[i].nxt)
    		{
    			ll v=s[i].v;
    			ll w=s[i].w;
    			
    			if(dis[v]>dis[u]+w)
    			{
    				dis[v]=dis[u]+w;
    				
    				if(!vis[v])
    				{
    					q.push(std::make_pair(-dis[v],v));
    				} 
    			}
    		}
    	}
    }
    
    int main(void)
    {
    	scanf("%lld %lld",&n,&m);
    	
    	for(int i=1;i<=m;i++)
    	{
    		ll x,y,z;
    		scanf("%lld %lld %lld",&x,&y,&z);
    		add(x,y,z);
    		add(y,x,z);
    	}
    	
    	dij(1);
    	
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=head[i];j;j=s[j].nxt)
    		{
    			ll v=s[j].v;
    			ll w=s[j].w;
    			
    			if(dis[v]==dis[i]+w)
    			{
    				num[v]++;
    			}
    		}
    	}
    	
    	for(int i=1;i<=n;i++)
    	{
    		if(num[i]) ans=ans*num[i]%mod;
    	}
    	
    	printf("%lld
    ",ans);
    	
    	return 0;
    }
    
  • 相关阅读:
    IPUtil
    MD5Util
    MyBatis环境配置及入门
    淘宝主页(静态页面)第3天
    淘宝主页(静态页面)第二天
    淘宝主页(静态页面)第1天
    力扣20 有效的括号
    力扣1 two sum
    JAVA可变参数
    JAVA环形队列
  • 原文地址:https://www.cnblogs.com/jd1412/p/14084313.html
Copyright © 2020-2023  润新知