【CCF 201712-4】行車路線(Dijkstra 80分)
阿新 • • 發佈:2018-12-10
忽略一個條件:可能具有連續的小路,跑一邊裸的迪傑斯特拉演算法,即可拿到80分
注意:邊權可能會爆int,採用long long才可以
#include <iostream> #include <cstring> using namespace std; const long long inf = 1e14; long long edge[505][505]; //邊的長度 bool vis[505]; //是否已經確定最短路徑的長度 long long d[505]; //最短路徑的長度 long long cur,a,b,c,n,m,flag,imin; void init() { memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); for(int i=1; i<=n; ++i) d[i] = inf; vis[1] = cur = 1; d[1] = 0; for(int i=0; i<m; ++i) //處理各邊長度 { cin>>flag>>a>>b>>c; if(flag == 1) c *= c; if(edge[a][b]==0 || c < edge[a][b]) edge[a][b] = edge[b][a] = c; } } int main() { cin>>n>>m; init(); for(int i=1; i<=n-1; ++i) //要再次加入n-1個結點 { for(int j=1; j<=n; ++j) //鬆弛當前結點的每一條出邊 { if(vis[j]==0 && edge[cur][j] && edge[cur][j] + d[cur] < d[j]) d[j] = edge[cur][j] + d[cur]; } imin = inf; for(int j=1; j<=n; ++j) //找到d值最小的結點 { if(vis[j]==0 && imin > d[j]) { imin = d[j]; cur = j; } } vis[cur] = 1; if(cur==n) break; //結點n的最短路徑被找到,退出 } cout<<d[n]; return 0; }