Dijkstra 堆優化 鄰接表存圖
阿新 • • 發佈:2018-12-21
#include<bits/stdc++.h> using namespace std; vector<int>vec[105],val[105]; int n,m; int dis[105]; bool vis[105]; int path[105]; #define inf 0x3f3f3f3f int main(){ int x,y,v; cin>>n>>m;//n邊 m點 for(int i=1;i<=n;i++){ cin>>x>>y>>v; vec[x].push_back(y); val[x].push_back(v); vec[y].push_back(x); val[y].push_back(v); } int st,en; memset(dis,inf,sizeof(dis)); cin>>st>>en; while(vec[]) return 0; } /* #include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN = 1e5 + 10; const LL INF = 1LL<<62; vector<int> e[MAXN];//點 vector<int> w[MAXN];//權 bool vis[MAXN]; LL dis[MAXN];//距離 int prev[MAXN];//記錄路徑 int n,m;//點數和邊數 struct node { LL d;//儲存距離 int u;//點的標號 bool operator<(const node & rhs) const { return d>rhs.d;//距離短的優先 } }; void dij() { priority_queue<node> q;//優先佇列 for(int i=1;i<=n;i++) { dis[i]=INF;//距離初始化 } dis[1]=0;//出發點的距離設定為1 memset(vis,0,sizeof(vis));//初始化 node tn; tn.d=0;//出發點的距離為0 tn.u=1;//出發點為1 q.push(tn);//入佇列 while(!q.empty())//佇列為空說明已經遍歷完了地圖 { node t=q.top();//出佇列(最短的出) q.pop(); int u=t.u; if(vis[u]) continue;//判斷是否訪問過 vis[u]=true;//訪問後標記 for(int i=0;i<e[u].size();i++) { int v = e[u][i]; if(dis[v]>dis[u]+w[u][i]) { dis[v]=dis[u]+w[u][i];//擇優選擇 prev[v]=u;//記錄路徑 tn.d=dis[v];//記錄距離 tn.u=v;//設定跳板 q.push(tn);//跳板入佇列 } } } } //vector<int> getpath(int t)//路徑還原 //{ // vector<int> path; // for(;t!=-1;t=prev[t]) // { // path.push_back(t); // } // reverse(path.begin(),path.end()); // return path; // } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { e[i].clear(); w[i].clear(); } int a,b,c; for(int i=1;i<=m;i++) { cin>>a>>b>>c; e[a].push_back(b); w[a].push_back(c); e[b].push_back(a); w[b].push_back(c); } dij(); if(dis[n]==INF) cout<<"-1"<<endl; else { e[1].clear(); e[1].push_back(n); while(prev[n]!=1) { n=prev[n]; e[1].push_back(n); } e[1].push_back(1); for(int i=e[1].size()-1;i>0;i--) { cout<<e[1][i]<<" "; } cout<<e[1][0]<<endl; } return 0; } */