今天,总结总结最近学的图论算法
一:最短路
1:dijkstra单源最短路
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <set>
#include <vector>
#define maxn 1000
#define INF 0x3f3f3f3f
using namespace std;
int cost[maxn][maxn]; //从 I—>J 的路径长度
int V; //点的个数
bool used[maxn]; //这个点是否确定下来了
int d[maxn]; //这个点到单源点的距离
void dijkstra(int x)
{ fill(d,d+V,INF);
fill(used,used+V,false); //准备工作
d[x] = 0;
int c;
while(1){
c=-1;
for(int i=0;i<V;i++) if(!used[i]&&(c==-1||d[i]<d[c])) c=i; //在所有的未确定点中 确定当距离单源点的最小点
if(c==-1) break;
used[c]=true;
for(int j=0;j<V;j++)
{
d[j]=min(d[j],d[c]+cost[c][j]);
}
}
}
int main()
{
cout<<"请输入多少个点:"<<endl;
cin>>V;
int Edge;
cout<<"请输入总共有多少个边:"<<endl;
cin>>Edge;
cout<<"下面进行边边信息的输入."<<endl;
int qi,zhong,zhi;
cout<<"起点,终点,两点之间路径值:"<<endl;
for(int i=0;i<V;i++)
for(int j=0;j<V;j++)
cost[i][j] = INF;
for(int i=0;i<Edge;i++)
{
cin>>qi>>zhong>>zhi;
cost[qi][zhong]=zhi;
cost[zhong][qi]=zhi;
}
dijkstra(1);
for(int i=0;i<V;i++)
{
cout<<"0->"<<i<<" distance:"<<d[i]<<endl;
}
return 0;
}
2 floyd算法
任意两点之间的最短路径
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <set>
#include <vector>
#define maxn 1000
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
int Edge;
while(cin>>V>>Edge){
if(V==0&&Edge==0)break;
int qi,zhong,zhi;
for(int i=0;i<V;i++)
for(int j=0;j<V;j++)
cost[i][j] = INF;
for(int i=0;i<Edge;i++)
{
cin>>qi>>zhong>>zhi;
cost[qi-1][zhong-1]=zhi;
cost[zhong-1][qi-1]=zhi; //这一行代码必不可少
}
for(int k=0;k<V;k++)
for(int i=0;i<V;i++)
for(int j=0;j<V;j++)
{
if(cost[i][j]>cost[i][k]+cost[k][j])
{
cost[i][j]=cost[i][k]+cost[k][j];
}
}
cout<<cost[0][V-1]<<endl;
}
return 0;
}