HYSBZ 2763||P4568 飛行路線(dijkstra+分層圖入門)
阿新 • • 發佈:2018-12-10
典型的分層圖的題,因為k的取值範圍很小,所以我們需要另外再建立k層圖,其實就是相當於跨層建邊,主要就是這個過程怎麼實現,剩下的就是一個裸的dij了。看到一份用二維陣列存的程式碼,感覺要比我的程式碼寫的簡單,過兩天敲一下試試,傳送門
AC程式碼:
#include <bits/stdc++.h> #define maxn 1200100 #define ll long long using namespace std; struct node{ int next; int to; int val; }Edge[maxn << 1]; struct Node{ int val,cnt; bool operator < (const Node &a) const { if(a.val == val) return a.cnt < cnt; return a.val < val; } }Next,Now; int n,m,k,s,e; int head[maxn],num,dist[maxn]; bool vis[maxn]; priority_queue<Node> q; void init(){ memset(head,-1,sizeof(head)); num = 0; } void add(int u,int v,int val){ Edge[num].to = v; Edge[num].val = val; Edge[num].next = head[u]; head[u] = num++; } void dijkstra(){ memset(vis,false,sizeof(vis)); memset(dist,0x3f,sizeof(dist)); Now.val = 0; Now.cnt = s; dist[s] = 0; q.push(Now); while(!q.empty()){ Now = q.top(); q.pop(); int flag = Now.cnt; if(vis[flag])continue; vis[flag] = true; for(int i=head[flag]; i != -1; i = Edge[i].next){ int u = Edge[i].to; if(!vis[u] && dist[u] > dist[flag] + Edge[i].val){ dist[u] = dist[flag] + Edge[i].val; Next.cnt = u; Next.val = dist[u]; q.push(Next); } } } int ans = 0x3f3f3f3f; for(int i=0;i<=k;i++){ ans = min(ans, dist[e + i * n]); } printf("%d\n",ans); } int main() { init(); scanf("%d%d%d",&n,&m,&k); scanf("%d%d",&s,&e); s++;e++; for(int i=0;i<m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); u++;v++; for(int j=0;j<=k;j++){ add(u+j*n, v+j*n, w); add(v+j*n, u+j*n, w); if(j != k){ add(u+j*n, v+(j+1)*n, 0); add(v+j*n, u+(j+1)*n, 0); } } } dijkstra(); return 0; }