다이나믹 프로그래밍
트리 맵이 주어짐. 출발 노드에서 모든 노드로 가는 데의 최소 비용을 구함. 음의 간선x
2차원 dp로 푼다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
int visit[1001];
int N,M;
int dig[1001][1001];
int d[1001];
int start,end;
int getsmall(){ //visit 체크되지 않은 수 중 가장 작은 수 찾기
int min = 99999999;
int index;
for(int i=1;i<=N;i++){
if(!visit[i]&&d[i]<min){
min = d[i];
index = i;
}
}
return index;
}
void print(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dig[i][j] !=99999999){
printf("%d ",dig[i][j]);
}else{
printf("-1 ");
}
}
printf("\\n");
}
}
int main(){
scanf("%d %d",&N,&M);
int t1, t2, t3;
for(int i=0;i<=N;i++){ //최대로 초기화 , 맵 만들기
for(int j=0;j<=N;j++){
dig[i][j]=99999999;
}
}
for(int i=0;i<M;i++){ //값 넣어줌
scanf("%d %d %d",&t1,&t2,&t3); //t1 -> t2 t3의 비용
dig[t1][t2] =t3<dig[t1][t2]?t3:dig[t1][t2]; //비용이 겹칠 때 최소비용으로 업뎃
}
scanf("%d %d",&start,&end);
visit[start]=1; //이미 잡은 기준 노드 =1 로 표시
for(int i=1;i<=N;i++){
dig[i][i]=0;
}
for(int i=1;i<=N;i++){
d[i]= dig[start][i];
}
for(int i=1;i<=N-1;i++){
int x = getsmall(); //업데이트 해줄 노드 구하기
// printf("%d\\n",x);
visit[x]= true;
for(int j=1;j<=N;j++){ // 1~N까지 노드 순환
if(!visit[j]){ //
if(d[x]+dig[x][j]<d[j]){
d[j] = d[x]+dig[x][j];
}
}
}
// for(int i=1;i<=N;i++){
// printf("%d ",d[i]);
// }
// printf("\\n");
}
printf("%d",d[end]);
}
최단경로이지선
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
int dig[20001][2];
int d[20001];
int visit[20001];
int V, E, start;
int getSmall() {
int min = 11;
int index;
for (int i = 1; i <= V; i++) {
if (!visit[i] && d[i] < min) {
min = d[i];
index = i;
}
}
return index;
}
void print() {
for (int j = start; j <= V; j++) {
if (d[j] != 11) {
printf("%d\\n", d[j]);
} else {
printf("INF\\n");
}
}
printf("\\n");
}
int main() {
scanf("%d %d", &V, &E);
int t1, t2, t3;
for (int i = 0; i <= V; i++) {
for (int j = 0; j <= V; j++) {
dig[i][j] = 11;
}
}
scanf("%d", &start);
visit[start] = 1;
for (int i = 1; i <= V; i++) {
dig[i][i] = 0;
}
for (int i = 0; i < E; i++) {
scanf("%d %d %d", &t1, &t2, &t3);
dig[t1][t2] = t3 < dig[t1][t2] ? t3 : dig[t1][t2];
}
for (int i = 1; i <= V; i++) {
d[i] = dig[start][i];
}
for (int i = 1; i <= V-1; i++) {
int x = getSmall();
visit[x] = 1;
for (int j = 1; j <= V; j++) {
if (!visit[j]) {
if (d[x] != 11 && dig[x][j] != 11 && d[x] + dig[x][j] < d[j]) {
d[j] = d[x] + dig[x][j];
}
}
}
}
print();
return 0;
}
특정한최단경로이채연
다음주까지 - 목요일 5시