您的位置:首页 > 其它

模板 图论 Dijkstra+堆优化

2015-01-23 10:37 459 查看
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#define INF 0xfffffff
#define MAXN 1000100
using namespace std;
struct node{
int v;
int c;
node(int _v=0,int _c=0):v(_v),c(_c){}
bool operator < (const node &r)const{
return c>r.c;
}
};
struct Edge{
int v,cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector <Edge> E[MAXN];
bool vis[MAXN];
int dist[MAXN];
void Dijkstra(int n,int start)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)   dist[i]=INF;
priority_queue <node> que;
while(!que.empty()) que.pop();
dist[start]=0;
que.push(node(start,0));
node tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u])  continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++)
{
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
que.push(node(v,dist[v]));
}
}
}
}
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: