列表

详情


NC219213. 超简单的最短路

描述

对,没错!这是为行行制作的最简单的最短路,这条路是通往行行毕业的路O(∩_∩)O哈哈~!所以你一定要帮行行顺利毕业哦!
现在给你一个包含n个点的有向图,并且路径上面还有康老师安排的数字放在上面,行行的通关任务就是求出从1到n的路径中数字之积最小的简单路径。

输入描述

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

输出描述

输出仅包括一行,记为所求路径的数字的乘积,由于答案可能很大,因此康老师很仁慈的让行行输出它模 9987的余数即可。

示例1

输入:

3 3
1 2 3 
2 3 3 
1 3 10

输出:

9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 887ms, 内存消耗: 8204K, 提交时间: 2023-03-05 17:20:22

#include <iostream>
#define inf 0x3f3f3f
long long a[1010][1010];
int main()
{
    long long k,i,j,n,m;
    scanf("%lld %lld",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j)a[i][j]=0;
            else a[i][j]=inf;
    long long fr,ed,l;
    for(i=1;i<=m;i++)
    {
        scanf("%lld %lld %lld",&fr,&ed,&l);
        a[fr][ed]=l;
    }
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(a[i][j]>a[i][k]*a[k][j]&&a[i][k]*a[k][j]!=0)
                    a[i][j]=(a[i][k]*a[k][j])%9987;
    printf("%lld",a[1][n]);
    return 0;
}

C++ 解法, 执行用时: 20ms, 内存消耗: 732K, 提交时间: 2021-11-25 17:13:19

#include<bits/stdc++.h>
using namespace std;
const int N = 1010,mod=9987;
typedef pair<int,int> pll;
vector<pll> a[N];
int n,m;
int maxn=1e9;
void dfs(int x,int y)
{
    if(x==n)
    {
        maxn=min(maxn,y);
    }
    for(auto k:a[x])
    {
        y=k.second*y;
        dfs(k.first,y);
    }
}
int main()
{
    cin>>n>>m;
    while(m--)
    {
        int q,w,e;
        cin>>q>>w>>e;
        a[q].push_back(make_pair(w,e));
        
    }dfs(1,1);
        cout<<maxn%mod;
        return 0;
}

上一题