zoukankan      html  css  js  c++  java
  • [洛谷P2384]最短路

    题目大意:给你一个图,要你求出其中1->n路径中乘积最小的一条路

    题解:用$log_2$把乘法变成加法,然后记录每个点的前驱,最后求出答案

    C++ Code:

    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int mod=9987;
    int n,m;
    int head[1010],cnt;
    struct Edge{
    	int to,cost,nxt;
    }e[1000010];
    int q[2000010],h,t,res=1;
    int tmp[1010][2]; 
    bool v[1010];
    double ans[1010]; 
    void addE(int a,int b,int c){
    	e[++cnt]=(Edge){b,c,head[a]};
    	head[a]=cnt;
    }
    void SPFA(int rt){
    	for (int i=2;i<=n;i++)ans[i]=1000000;
    	q[++t]=rt;
    	while (h<t){
    		int x=q[++h];
    		v[x]=false;
    		for (int i=head[x];i;i=e[i].nxt){
    			int to=e[i].to;double lg=log(e[i].cost);
    			if (ans[to]>ans[x]+lg){
    				ans[to]=ans[x]+lg;
    				tmp[to][0]=x,tmp[to][1]=e[i].cost;
    				if (!v[to]){
    					v[to]=true;
    					q[++t]=to;
    				}
    			}
    		} 
    	}
    	for (int i=n;i!=1;i=tmp[i][0])res=(res*tmp[i][1])%mod;
    	printf("%d
    ",res);
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for (int i=0;i<m;i++){
    		int a,b,c;
    		scanf("%d%d%d",&a,&b,&c);
    		addE(a,b,c);
    	}
    	SPFA(1);
    	return 0;
    } 
    
  • 相关阅读:
    BUG漏测的原因总结,以及如何处理
    费用流
    拉格朗日插值
    数论问题整理
    计数问题
    POJ 1741 Tree
    bzoj 2820: YY的GCD
    luogu P3690 【模板】Link Cut Tree (动态树)
    bzoj 1036: [ZJOI2008]树的统计Count
    bzoj 3282: Tree
  • 原文地址:https://www.cnblogs.com/Memory-of-winter/p/8557742.html
Copyright © 2011-2022 走看看