dijkstra+priority_queue+vector

最短路

时间限制: 3 Sec  内存限制: 128 MB

题目描述

给定M条边,N个点的带权无向图 
求1到N的最短路 
N<=100000 
M<=500000

输入

第一行:N,M 
接下来M行3个正整数:ai,bi,ci 表示ai,bi之间有一条长度为ci的路 
0<=ci<=1000

输出

一个整数,表示1到N的最短距离

样例输入

4 4
1 2 1
2 3 1
3 4 1
2 4 1

样例输出

2

提示

注意图中可能有重边和自环,数据保证1到N有路径相连

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<vector>
 8 #include <queue>
 9 using namespace std;
10 typedef long long ll;
11 typedef long double ld;
12 typedef pair<int,int> pr;
13 const double pi=acos(-1);
14 #define rep(i,a,n) for(int i=a;i<=n;i++)
15 #define per(i,n,a) for(int i=n;i>=a;i--)
16 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
17 #define clr(a) memset(a,0,sizeof(a))
18 #define pb push_back
19 #define mp make_pair
20 #define fi first
21 #define sc second
22 #define pq priority_queue
23 #define pqb priority_queue <int, vector<int>, less<int> >
24 #define pqs priority_queue <pr, vector<pr>, greater<pr> >
25 ld eps=1e-9;
26 ll pp=1000000007;
27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
29 void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
30 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
31 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
32 ll read(){ ll ans=0; char last=‘ ‘,ch=getchar();
33 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar();
34 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar();
35 if(last==‘-‘)ans=-ans; return ans;
36 }
37 #define N 100005
38 const int inf=1<<29;
39 vector<pr> vec[N];
40 pqs Q;
41 int dis[N],vis[N];
42 int main()
43 {
44     int n=read(),m=read();
45     for (int i=1;i<=m;i++) {
46         int a=read(),b=read(),c=read();
47         vec[a].pb(mp(b,c));
48         vec[b].pb(mp(a,c));
49     }
50     for (int i=1;i<=n;i++) dis[i]=inf;
51     dis[1]=0; Q.push(mp(dis[1],1));
52     while (!Q.empty()){
53         pr p=Q.top(); Q.pop(); int u=p.sc;
54         if (vis[u]) continue; vis[u]=1;
55         for (int i=0;i<vec[u].size();i++){
56             if (vec[u][i].sc+dis[u]<dis[vec[u][i].fi])
57                 dis[vec[u][i].fi]=vec[u][i].sc+dis[u];
58                 Q.push(mp(dis[vec[u][i].fi],vec[u][i].fi));
59         }
60     }
61     printf("%d",dis[n]);
62     return 0;
63  } 

时间: 2024-08-30 07:08:43

dijkstra+priority_queue+vector的相关文章

[Usaco2005][BZOJ1674] Part Acquisition|dijkstra|priority_queue

1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 308  Solved: 143[Submit][Status][Discuss] Description The cows have been sent on a mission through space to acquire a new milking machine for their barn. They are flying

BOI&#39;98 DAY 2 TASK 1 CONFERENCE CALL Dijkstra/Dijkstra+priority_queue/SPFA

BOI'98 DAY 2 TASK 1 CONFERENCE CALL PROBLEM A telecom company would like to offer a three-party conference call service. This service enables three customers to participate in a telephone conversation simultaneously. A customer accesses the interconn

Dijkstra 优先队列优化

#include <iostream> #include <queue> #include <vector> using namespace std; const int N=405; struct rec { int v,w; }; vector<rec> edge[N*N]; int n,st,ed; __int64 dis[N*N]; bool vis[N*N]; struct cmp { bool operator()(int a,int b) {

P103 单源最短路问题 第三种Dijkstra算法

///通过队列,找出最小的dis[]值,取出配对的vertex值. /// stack priority_queue set struct edge { int to; int cost; } ; vector <edge>G[MZX_V];///表 typedef pair<int ,int > Pa;///Pa.second是点的编号 Pa.first是到该点的最短距离 int dis[MAX_V]; void Dijkstra( ) { priority_queue<

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析: 单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存. 还

uva 11367 dijkstra+dp状态压缩

题意:给出n个地点 和 每个地点的油价 ,有 m 条边 , 并给出每条边长度 .1单位汽油可以走1千米  , 油箱的容量为 c , 在初始点 s 时 , 油箱中的油为 0 , 求s 到 t 的最小花费 . 解法: 定义 状态 d[i][j] 表示到达 地点 i 且油箱中有 j 单位油时的最小 花费. 对于状态的转移时 , 有两种方法: 1.把每个点的所有状态都求出 2.不把每个点的状态都求出 , 而是一单位一单位的加油. 对于第一种方法 , 会超时 , 因为每个点的状态太多 , 但是能用的状态就

【Dijkstra算法】Roadblocks

Time Limit: 2000MS   Memory Limit: 65536K       Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along th

POJ 1511 Invitation Cards 【最短路,spfa算法,Dijkstra算法堆优化】

Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 25219   Accepted: 8346 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan