1. 程式人生 > >圖論一頓套模版

圖論一頓套模版

圖論一頓套模版

https://ac.nowcoder.com/acm/contest/283/H

題目描述

由於臨近廣西大學建校90週年校慶,西大開始了喜聞樂見的校園修繕工程! 然後問題出現了,西大內部有許許多多的道路,據統計有N棟樓和M條道路 (單向),每條路都有“不整潔度”W,現在校方想知道從S樓到T樓的所有路徑中,“不整潔度” 乘積最小是多少。 由於答案可能很大,所以你需要將最後的答案 10 9 +7取模

輸入描述:

第一行為四個整數N、M、S、T,意義如上。 第2至第M+1行每行表示一條道路,有三個整數,分別表示每條道路的起點u,終點v和“不整潔度”W。 輸入保證沒有自環,可能有重邊。
其中W一定是2的整數次冪。

輸出描述:

輸出一個整數,表示最小的不整潔度之乘積對10 9+7取模的結果。 若無解請輸出 -1 示例1

輸入

4 4 1 3
1 2 8
1 3 65536
2 4 2
4 3 16

輸出

256

因為W是2的整數次冪,所以可以把W=log2(W),由乘法變成加法

  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 }
View Code