SPFA+SLF+LLL优化模板
2018-06-17 21:35:50来源:未知 阅读 ()
1 #include<algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <climits> 6 #include <cstdio> 7 #include <string> 8 #include <cmath> 9 #include <stack> 10 #include <deque> 11 12 using namespace std; 13 const int INF=1<<30; 14 const int gg=200000 + 11; 15 int head[gg]; 16 int dis[gg]; 17 int n,m; 18 int cnt; 19 bool vis[gg]; 20 int sum,tot; 21 struct node{ 22 int net; 23 int to; 24 int w; 25 }a[gg]; 26 27 inline void add(int i,int j,int w) 28 { 29 a[++cnt].to=j; 30 a[cnt].net=head[i]; 31 a[cnt].w=w; 32 head[i]=cnt; 33 } 34 35 inline void spfa(int s) 36 { 37 deque<int>q; 38 for(int i=1;i<=n;i++) 39 dis[i]=INF; 40 dis[s]=0; 41 vis[s]=true; 42 q.push_back(s); 43 tot=1; 44 while(!q.empty()) 45 { 46 int u=q.front(); 47 q.pop_front(); 48 vis[u]=false; 49 tot--; 50 sum-=dis[u]; 51 for(int i=head[u];~i;i=a[i].net) 52 { 53 int v=a[i].to; 54 if(dis[v]>dis[u]+a[i].w) 55 { 56 dis[v]=dis[u]+a[i].w; 57 if(!vis[v]) 58 { 59 vis[v]=true; 60 if(q.empty()||dis[v]>dis[q.front()]||dis[v]*tot<=sum) 61 q.push_back(v); 62 tot++; 63 sum+=dis[v]; 64 } 65 } 66 } 67 } 68 } 69 70 int main() 71 { 72 memset(head,-1,sizeof(head)); 73 cin>>n>>m; 74 for(int i=1;i<=m;i++) 75 { 76 int a,b,c; 77 cin>>a>>b>>c; 78 add(a,b,c); 79 add(b,a,c); 80 } 81 spfa(1); 82 if(dis[n]==INF) 83 { 84 cout<<-1<<endl; 85 return 0; 86 } 87 else 88 { 89 cout<<dis[n]<<endl; 90 } 91 return 0; 92 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++冒泡排序 (基于函数模板实现) 2020-05-31
- C++ 模板类vector 2020-05-31
- C++ 模板类array 2020-05-31
- C++ 模板类vector 2020-05-30
- 单调队列模板【附例题】 2020-05-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash