https://ac.nowcoder.com/acm/contest/283/H
ios
4 4 1 3 1 2 8 1 3 65536 2 4 2 4 3 16
256
由於W是2的整數次冪,因此能夠把W=log2(W),由乘法變成加法ide
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #define maxn 200005 10 #define INF 0x3f3f3f3f3f3f3f3f 11 const long long MOD=1e9+7; 12 using namespace std; 13 14 int n,m,k; 15 struct sair{ 16 long long len,pos; 17 friend bool operator<(sair a,sair b){ 18 return a.len>b.len; 19 } 20 }; 21 long long dis[maxn]; 22 long long vis[maxn]; 23 24 long long pow_mod(long long sum){ 25 long long ans=1; 26 long long b=2; 27 while(sum){ 28 if(sum&1) ans=(b*ans)%MOD; 29 b=(b*b)%MOD; 30 sum>>=1; 31 } 32 return ans; 33 } 34 35 vector<pair<long long,long long> >v[maxn]; 36 void Dijstra(int s,int t){ 37 priority_queue<sair>q; 38 sair tmp; 39 tmp.len=0,tmp.pos=s; 40 dis[s]=0; 41 q.push(tmp); 42 while(!q.empty()){ 43 tmp=q.top(); 44 q.pop(); 45 long long pos=tmp.pos; 46 if(vis[pos]){ 47 continue; 48 } 49 vis[pos]=1; 50 for(int i=0;i<v[pos].size();i++){ 51 long long f=v[pos][i].first; 52 long long len=v[pos][i].second; 53 54 if(dis[f]>dis[pos]+len){ 55 dis[f]=dis[pos]+len; 56 tmp.pos=f; 57 tmp.len=dis[f]; 58 q.push(tmp); 59 } 60 } 61 } 62 63 if(dis[t]==INF) cout<<-1<<endl; 64 else cout<<pow_mod(dis[t])<<endl; 65 } 66 67 68 69 int main(){ 70 71 std::ios::sync_with_stdio(false); 72 int s,t; 73 cin>>n>>m>>s>>t; 74 for(int i=0;i<=n;i++){ 75 dis[i]=INF; 76 vis[i]=0; 77 } 78 for(int i=0;i<=n;i++){ 79 v[i].clear(); 80 } 81 int a,b; 82 long long c; 83 int j; 84 for(int i=1;i<=m;i++){ 85 cin>>a>>b>>c; 86 c=log2(c); 87 for(j=0;j<v[a].size();j++){ 88 if(v[a][j].first==b){ 89 if(v[a][j].second>c){ 90 v[a][j].second=c; 91 } 92 break; 93 } 94 } 95 if(j==v[a].size()){ 96 v[a].push_back(make_pair(b,c)); 97 } 98 } 99 Dijstra(s,t); 100 system("pause"); 101 }