1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include<iostream> #include<cstring> #include<sstream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #define read(x) scanf("%lld",&x) #define Read(x,y) scanf("%lld%lld",&x,&y) #define gc(x) scanf(" %c",&x) #define mmt(x,y) memset(x,y,sizeof x) #define write(x) printf("%d\n",x) #define INF 0x3f3f3f3f #define ll long long #define mod ((1LL<<31) - 1LL) const ll N = 1005; const ll M = 1e6; ll d[N]; bool vis[N]; ll head[N],tot; ll p[N]; struct Edge { ll next; ll to; ll dis; }edge[M*2]; inline void add(ll from,ll to,ll dis) { edge[++tot].next = head[from]; edge[tot].to = to; edge[tot].dis = dis; head[from] = tot; } struct node { ll id,val; node(){} node(ll a,ll b):id(a),val(b){} bool operator <(node A)const{ return val > A.val; } }; void dij(ll u,ll id) { mmt(p,0); if(id == 0) mmt(d,0x7f); mmt(vis,0); d[u] = 0; p[u] = 1; priority_queue<node> Q; Q.push({u,0}); node tmp; while(Q.size()){ tmp = Q.top(); Q.pop(); int x = tmp.id; if(vis[x]) continue; vis[x] = 1; for(int i = head[x];~i;i = edge[i].next){ int y = edge[i].to; ll dis = edge[i].dis; if(d[y] >= d[x] + dis){ if(id == 1) p[y] ++; d[y] = d[x] +dis; Q.push({y,d[y]}); } } } } void init() { mmt(head,-1); tot = 0; } int main() { init(); ll n,m; ll f,t,dis; Read(n,m); for(ll i = 1;i <= m;++i){ Read(f,t);read(dis); add(f,t,dis); add(t,f,dis); } dij(1,0); dij(1,1); ll ans = 1; for(int i =1;i<= n;++i){ ans = ans*p[i]%mod; } cout<<ans;
}
|