圖論一頓套模版

圖論一頓套模版

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

ios

題目描述

因爲臨近廣西大學建校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),由乘法變成加法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 }
View Code
相關文章
相關標籤/搜索