图论最短路模板
迪杰斯特拉算法
单源最短路,不能有负权的边
时间复杂度:O(ElogE) //V为顶点数,E为边数
输入dis[] //dis[t]代表从s到t的最短路径
使用Vector:
const int INF=0x3f3f3f3f; vector<pair<int,int> > v[maxn]; int dis[maxn]; void dijkstra(int s) { memset(dis,INF,sizeof(dis)); dis[s]=0; priority_queue<pair<int,int>,vector<pair<int,int> >,great<pair<int,int> > > que; que.push(make_pair(dis[s],s)); while(!que.empty()){ int now=que.top().second; que.pop(); for( i=0;i<v[now].size();i++ ){ int t=v[now][i].first; if( dis[t]>dis[now]+v[now][i].second ){ dis[t]=dis[now]+v[now][i].second; que.push(make_pair(dis[t],t)); } } } }
手写邻接表:
const int INF=0x3f3f3f3f; int dis[maxn],u[maxn],v[maxn],w[maxn],head[maxn],cnt; priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > que; struct edge{ int v,w,next; }edge[maxn]; void add_edge(int u,int v,int w) { edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } void init() { cnt=0; memset(head,-1,sizeof(head)); while(!que.empty()) que.pop(); } void dijkstra(int s) { dis[s]=0; memset(dis,INF,sizeof(dis)); que.push(make_pair(dis[s],s)); while(!que.empty()){ pair<int,int> now=que.top(); que.pop(); if( dis[now.second]<now.first ) continue; for( int i=head[now.second];i!=-1;i=edge[i].next ){ int t=edge[i].v; if( dis[t]>dis[now.second]+edge[i].w ) { dis[t]=dis[now.second]+edge[i].w; que.push( make_pair( dis[t],t ) ); } } } }