今天的题竟然有图!!我还没看过这个部分!!离散上课没听讲过有木有!!!
下面贴出今天学的单源最短路,只能现学现卖了!!!
单源最短路问题是固定一个起点,求它到其他所有点的最短路问题,也包括终点也固定的问题
1-Bellman-Ford算法
//单源最短路算法(BELLMAN-FORD算法)
struct edge{int from,to,cost}; //从顶点from指向顶点TO的权值为cost的边
edge es[MAX_E]; //边
int d[MAX_v]; //最短距离
int V,E; //V是顶点数,E是边数
//求解从顶点s出发到所有点的最短距离
void shortest_path(int s)
{
for(int i=0;i<V;i++) d[i]=INF;
d[s]=0;
while(true)
{
bool update=false;
for(int i=0;i<E;i++)
{
edge e=es[i];
if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost)
{
d[e.to]=d[e.from]+e.cost;
update=true;
}
}
if(!update) break;
}
}
//如果返回true则存在负圈
bool find_negative_loop()
{
memset(d,0,sizeof(d));
for(int i=0;i<V;i++)
for(int j=0;j<E;j++)
{
edge e=es[j];
if(d[e.to]>d[e.from]+e.cost)
{
d[e.to]=d[e.from]+e.cost;
//如果第n次仍然更新了,则存在负圈
if(i==V-1) return true;
}
}
return false;
}
写完瞬间感觉很蛋疼有木有!
2-Dijlstra算法(wufajiejue 无法解决图中存在负边的问题)
(1)找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离。
(2)此后不需要再关心1中的“最短距离已经确定的顶点”
int cost[MAX_V][MAX_V]; //csot[u][v]表示边e=(u,v)的权值(不存在这条边时设为INF)
int d[MAX_V]; //顶点s出发的最短距离
bool used[MAX_V]; //已经使用过的图
int V; //顶点数
//求从起点s到各个顶点的最短距离
void dijkstra(int s)
{
fill(d,d+V,INF);
fill(used,used+V,false)
d[s]=0;
while(true)
{
int v=-1;
//从尚未使用过的顶点中选择一个距离最小的顶点
for(int u=0;u<V;u++)
{
if(!used[u]&&(v==-1||d[u<d[v]]))
v=u;
}
if(v==-1)break;
used[v]=true;
for(int u=0;u<V;u++)
{d[u]=min(d[u],d[V]+cost[v][u]);}
}
}
先更到这里吧,暑假的目标是先把搜索,dp,图论搞搞。。