【模板】 Floyd, Dijkstra, SPFA

【模板】 Floyd, Dijkstra, SPFA

//Floyd
inline void Floyd(){
memset(dis,0x3f,sizeof(dis));
for(int k = 1;k<=N;k++){
for(int i = 1;i<=N;i++){
for(int j = 1;j<=N;j++){
dis[i][j] = min(dis[i][k]+dis[k][j],dis[i][j]);
}
}
}
}
//Dijkstra
struct Node{
int dis,pos;
friend bool operator < (Node A,Node B){
return A.dis > B.dis;
}
Node(int d,int p) : dis(d) , pos(p) {};
};
priority_queue<Node> Q;
int dis[maxN];
int vis[maxN];
inline void Dijkstra(int u){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[u] = 0;
vis[u] = 1;
Q.push(Node(0,u));
while(!Q.empty()){
int pos = Q.top().pos;
Q.pop();
for(int i = head[pos];i;i = edge[i].nxt){
int to = edge[i].to;
int wei = edge[i].w;
if(dis[to] > dis[pos] + wei){
dis[to] = dis[pos] + wei;
if(!vis[to]) Q.push(Node(dis[to],to));
}
}
}
}
//SPFA
inline void SPFA(int u){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int>Q;
Q.push(u);
vis[u] = 1;
dis[u] = 0;
while(!Q.empty()){
int id = Q.front();
Q.pop();
vis[id] = 0;
for(int i = head[id]; i; i = edge[i].nxt) {
int to = edge[i].to;
if(dis[to] > dis[id] + edge[i].w) {
dis[to] = dis[id] + edge[i].w;
if(!vis[to]) {
Q.push(to);
vis[to] = 1;
}
}
}
}
}
posted @   Burnling  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示