최 단 로 문제 소결
전역 최 단 경로 문제 - 그림 의 모든 최 단 경 로 를 구하 십시오.
그림 의 저장 구조:http://blog.csdn.net/ncepuzhuang/article/details/8445090
가장 많이 사용 되 는 경로 알고리즘 은 1. Floyd 알고리즘 입 니 다.
2. Dijkstra 알고리즘.
3. Bellman - ford 알고리즘.
4. SPFA 알고리즘.
다음은 한 명 씩 설명 하 겠 습 니 다.
1. Floyd 알고리즘.다 원, 무 마이너스 변 의 최 단 로 를 구하 다.실효 성 이 떨 어 지고 시간 복잡 도 O (V ^ 3).공간 복잡 도 는 O (N ^ 2) 입 니 다.임의의 두 점 사이 의 가장 짧 은 경 로 를 해결 하 는 알고리즘 이다.
http://blog.csdn.net/zhangxiangdavaid/article/details/38366923
핵심 코드:
void floyd(int n)
{
int i,k,j;
for(k=0; kmap[i][k]+map[k][j])// i-->j i-->k--->j
map[i][j]=map[i][k]+map[k][j];// i--->j
}
2. Dijkstra 알고리즘 은 단원, 무 음 권 의 최 단 로 를 구한다.실효 성 이 비교적 좋 고 시간 복잡 도 는 O (V * V + E) 이다.욕심 법 으로 처리 되 지 않 은 최소 가중치 가 있 는 노드 를 선택 한 다음 에 그 아웃 사 이 드 를 이완 시킨다.
http://blog.csdn.net/zhangxiangDavaid/article/details/38360337
핵심 코드:
int dijkstra (int v)
{
//
for (i=1;i<=n;i++)
{
vist[i]=0;
dis[i]=map[v][i];
}
// n-1
for (i=1;idis[pos]+map[pos][j])
dis[j]=dis[pos]+map[pos][j];
}
}
return dis[n];
}
3. Bellman - ford 알고리즘 은 단원 최 단 로 를 구하 고 마이너스 회로 (있 으 면 최 단 로 가 존재 하지 않 음) 가 있 는 지 판단 할 수 있 으 며 실효 성 이 좋 고 시간 복잡 도 O (VE) 가 있다.dijkstra 와 마찬가지 로 느슨 한 조작 을 바탕 으로 한다. 즉, 예상 되 는 최 단 경로 값 은 점점 더 정확 한 값 으로 대체 되 어 최 적 화 될 때 까지 이다.그것 의 원 리 는 그림 에 대해 n - 1 차 이완 작업 을 하여 가능 한 모든 최 단 경 로 를 얻 는 것 이다.dijkstra 보다 좋 은 점 은 변 의 가중치 가 마이너스 이 고 실현 이 간단 하 며 시간 복잡 도가 너무 높다 는 것 이 단점 이다.하지만 최적화 해 효율 을 높 일 수 있다.마이너스 링 은 마이너스 링 이 총 비용 을 제한 없 이 낮 출 수 있 기 때문에 n 차 조작 이 비용 을 낮 출 수 있다 는 것 을 발견 하면 반드시 마이너스 링 이 존재 한다 고 판정 했다.
핵심 코드:
struct node
{
int u;//
int v;//
int w;//
} p[inf];
int dis[inf];//
//
int nodenum,edgenum,source,i,j;
//
void init ()
{
scanf ("%d%d%d",&nodenum,&edgenum,&source);
for (i=0; i<=nodenum; i++)
{
dis[i]=inf;
}
dis[source]=0;
for (i=0; i dis[p[j].u] + p[j].w)// dis
{
dis[p[j].v] = dis[p[j].u] + p[j].w;
flag=1;
}
}
if (flag==0)
break;
}
//
// for dis
//
for (i=0; i dis[p[i].u] + p[i].w)
{
return ;// 0 1
}
}
}
4.SPFA Bellman-Ford , , O(kE)。(k<
:
void SPFA(int s,int e) // s e
{
int l,r,i;
l=r=0;
memset(vis,0,sizeof(vis));
memset (dis,inf,sizeof (dis));
dis[s]=0;
q[r++]=s;//
vis[s]=1;// 1
// 0
while(l dis[p] + map[p][i])
{
dis[i] = dis[p] + map[p][i];
if(vis[i]==0)
{
q[r++] = i;
vis[i] = 1;
}
}
}
vis[p] = 0;
}
if(dis[e]!= inf)
printf("%d
",dis[e]);
else
printf("-1
");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1233 또는 원활 한 공정 최소 생 성 트 리 (prim 알고리즘 + kruskal 알고리즘)그럼 이 연결 서브 맵 은 G 의 최소 생 성 트 리 입 니 다.최소 생 성 트 리 를 구 하 는 흔 한 알고리즘 은 Prim 알고리즘 입 니 다. 욕심 전략 을 사용 하기 때문에 집합 S 에 새로운 정점 을 추가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.