HDU 3790 最短路徑問題

2021-06-11 11:42:36 字數 1560 閱讀 5268

#include#include#include#define nil 100000

struct node

node[1001];

/*初始化操作,把源點初始化為0,其他正無窮

@param n 結點個數

@param s 源點

*/int init_shortpath_source(int n, int s)

node[s].d = 0; //源點最短路徑置為 0

node[s].m = 0;//最小花費置為 0

return 1;

}/*鬆弛操作

*@param u 路徑起始點

*@param v 路徑結束點

*@param gp 路徑圖

*@param gm 花費圖

*/int relax(int u, int v, int** gp, int** gm)

else if(node[v].d == node[u].d + gp[u][v]) //對花費進行鬆弛 }

return 1;

}/*申請二維陣列空間, 大小為n*n

@param n 二維陣列空間的 大小

@result 返回乙個 (n+1)*(n+1) 大小的 二維陣列,下標從1開始到n

*/ return p;

}/*初始化二維陣列

@param gp 儲存路徑權值

@param gm 儲存花費權值

*/int init(int **gp, int **gm, int n)

} return 1;

}/**

dijkstra 演算法

*/int dijkstra(int ** gp, int ** gm, int s, int n)

} for(++i; i <= n; ++i)

}/*將該點 加入 1 集合*/

node[index].flag = 1;

/*對每個以該點為起點的路徑進行鬆弛操作*/

for(j = 1; j <= n; ++j)

}} return 1;

}/*列印乙個二維陣列*/

int printf_array_2(int ** array, int n)

printf("\n");

} return 1;

}/*主方法*/

int main()

/*解決多條路徑具有相同權值問題,取花費最小的一條路徑進行運算*/

else if(gp[a][b] == p && gm[a][b] > q)

}/*輸入源點和終點*/

scanf("%d%d",&s,&e);

/*進行dijkstra運算*/

dijkstra(gp,gm,s,n);

/*輸出結果*/

printf("%d %d\n",node[e].d, node[e].m);

/*釋放空間*/

free(gm);

free(gp);

/*等待下組資料*/

scanf("%d%d",&n,&m);

}}

hdu3790 最短路徑問題

wa了無數次,終於過了,還是dijkstra,只不過在距離,相同時,多判斷一下時間。注意重邊!include include include define m 0x7fffffff using namespace std struct p 2000 struct c 1020 1020 int vi...

HDU 3790 最短路徑問題

hdu 3790 最短路徑問題 單源最短路勁,更新路勁時要更新花費 include include include includeusing namespace std define inf 0x7fffffff int n,m int map 1005 1005 int cost 1005 100...

HDU 3790 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,...