题目:最短路
思路:dijkstra求最短路模板。
注意:中间过程中要用long long,且只能在最后一步取模。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
#define maxm 1000000
#define md 9987
#define ll long long
struct Edge{
ll x,y,z;
void scan(){
scanf("%lld%lld%lld",&x,&y,&z);
}
};
struct Pair{
ll x,y;
bool operator <(const Pair& oth) const {
return y<oth.y||(y==oth.y&&x<oth.x);
}
Pair(ll xx,ll yy){
x=xx,y=yy;
}
};
ll n,m;
vector<Edge> a[maxn+5];
void add_edge(Edge x){
a[x.x].push_back(x);
}
priority_queue<Pair> que;
ll dist[maxn+5];
bool isuse[maxn+5]={0};
void dijkstra(){
for(ll i=2;i<=n;i++) dist[i]=(1<<30);
dist[1]=1;
que.push(Pair(1,1));
while(!que.empty()){
Pair h=que.top();
que.pop();
ll u=h.x;
if(isuse[u]) continue;
isuse[u]=true;
for(ll i=0;i<a[u].size();i++){
if(dist[u]*a[u][i].z<dist[a[u][i].y]){
dist[a[u][i].y]=dist[u]*a[u][i].z;
que.push(Pair(a[u][i].y,dist[a[u][i].y]));
}
}
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
Edge x;
x.scan();
add_edge(x);
}
dijkstra();
printf("%lld",dist[n]%md);
return 0;
}