最短路徑:從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊權值之和最小的一條路徑
單源最短路:在圖中,指定乙個點為源,求源到其它各點的最短路徑
1.dijkstra演算法 o(nlogn)流程
錄入圖的資訊並完成初始化
找到目前離源節點最近的點p
利用p的所有出邊優化源節點到p出邊鄰近節點的邊權值
圖除了源節點其餘n-1個結點都優化過,那麼進行5,否則進行2
輸出
#include#include#includeusing namespace std;
const int maxn=100;
const int maxm=10000;
int book[maxn],dis[maxn],head[maxn],cnt;
struct nodeside[maxm];
struct node
node(int id,int cost):id(id),cost(cost){}
friend bool operator < (node a,node b) };
void init()
void add(int x,int y,int d)
void dij(int sx,int ex)
} }printf("%d\n",dis[ex]);
}int main()
scanf("%d%d",&s,&e);
dij(s,e);
return 0;
}
一些應用:
1.求點s到其餘各點的最短距離之和
1.去掉if(now.id==ex) break;
2.dij(s);
3.for(int i=1;i<=n;i++)
ans+=dis[i];
2.求有向圖其餘各點到該點的距離之和
1.同上
2.倒著存圖 (原: add(x,y,z);現: add(y,x,z));
3.同上
2.spfa演算法
#include#include#includeusing namespace std;
const int maxn=100;
const int maxm=10000;
struct nodeside[maxm];
int head[maxn],dis[maxn],cont[maxn],book[maxn],cnt,n,m;
void init()
void add(int x,int y,int d)
void spfa(int sx,int ex)
q.push(y);}}
} }if(!flag)
printf("%d\n",dis[ex]); }
int main()
scanf("%d%d",&s,&e);
spfa(s,e);
return 0;
}
負環:全部由負權邊組成的環,這樣的話就不存在最短路,因為在負環中每轉一圈最短路長度總會變小
判負環的原理:在spfa演算法中,每個點最多鬆弛的次數為n-1,n為節點個數當乙個節點被鬆弛超過n次時,那麼說明圖中存在負環
利用spfa判正環:
1.dis初始化 memset(dis,0,sizeof(dis);
2.鬆弛操作的「>」改為「<」;
單源最短路徑演算法
簡單介紹 最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小 這裡的花銷可能是時間也可能指費用等 dijkstra是用於解決單源最短路徑的經典演算法。圖的儲存方式 鄰接矩陣 在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成...
單源最短路 Dijkstra演算法
前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...
單源最短路演算法 Dijkstra
dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...