洛谷 P2384 最短路

题目背景

狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗?

他会给你100000000000000000000000000000000000%10金币w

题目描述

给定n个点的带权有向图,求从1到n的路径中边权之积最小的简单路径。

输入输出格式

输入格式:

第一行读入两个整数n,m,表示共n个点m条边。 接下来m行,每行三个正整数x,y,z,表示点x到点y有一条边权为z的边。

输出格式:

输出仅包括一行,记为所求路径的边权之积,由于答案可能很大,因此狗哥仁慈地让你输出它模9987的余数即可。

废话当然是一个数了w

//谢fyszzhouzj指正w

对于20%的数据,n<=10。

对于100%的数据,n<=1000,m<=1000000。边权不超过10000。

输入输出样例

输入样例#1: 复制
3 3
1 2 3 
2 3 3 
1 3 10
输出样例#1: 复制
9

说明

好好看一看再写

哟w、



#include<bits/stdc++.h>
using namespace std;
#define  maxn 10000+1000
#define inf 99999999
#define mod 9987
int n,m;
int fa[maxn];
struct ac{
   int y,z;
   ac(){};
   ac(int a,int b){
      y=a; z=b;
   }
};
vector<ac>q[maxn];
int mi=inf;
void dfs(int x,int y){
   if(mi<y) return ;
   if(x==n){
      mi=min(mi,y);
      return ;
   }
   for(int j=0;j<q[x].size();j++){
      ac e=q[x][j];
      if(!fa[e.y]){
         fa[e.y]=1;
         dfs(e.y,e.z*y%mod);
         fa[e.y]=0;
      }
   }
}
int main(){
   //int n,m;
   cin>>n>>m;
   memset(fa,0,sizeof(fa));
   for(int j=0;j<m;j++){
     int x,y,z;
     scanf("%d%d%d",&x,&y,&z);
     q[x].push_back(ac(y,z));
   }
   fa[1]=1;
   dfs(1,1);

   cout<<mi<<endl;

   return 0;
}


©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值