分层图+Dijkstra

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int MAXN=100100;
 7 const int MAXM=500100;
 8 const int INF=0x3f3f3f3f;
 9 
10 struct Edge
11 {
12     int to,next;
13     int w;
14 }e[MAXM*80];
15 int head[MAXM*80],cnt=0;
16 void addEdge(int x,int y,int z)
17 {
18     cnt++;
19     e[cnt].to=y;
20     e[cnt].next=head[x];
21     e[cnt].w=z;
22     head[x]=cnt;
23     return;
24 }
25 
26 int n,m,k;
27 ll t[MAXN*80];
28 bool vis[MAXN*80];
29 
30 void Dijkstra()
31 {
32     for (int i=1;i<=(k+1)*n;i++)
33     {
34         t[i]=INF;
35         vis[i]=false;
36     }
37     t[1]=0;
38 
39     priority_queue< pair<int,int> >pq;
40     pq.push(make_pair(0,1));
41 
42     while (!pq.empty())
43     {
44         int cur=pq.top().second;
45         pq.pop();
46 
47         if (vis[cur])   continue;
48         vis[cur]=true;
49 
50         for (int i=head[cur];i!=0;i=e[i].next)
51         {
52             if (t[e[i].to]>t[cur]+e[i].w)
53             {
54                 t[e[i].to]=t[cur]+e[i].w;
55                 pq.push(make_pair(-t[e[i].to],e[i].to));
56             }
57         }
58     }
59     return;
60 }
61 
62 int main()
63 {
64     cin>>n>>m>>k;
65 
66     int u,v,w;
67     for (int i=1;i<=m;i++)
68     {
69         cin>>u>>v>>w;
70         for (int i=0;i<=k;i++)
71         {
72             addEdge(u+i*n,v+i*n,w);
73             addEdge(v+i*n,u+i*n,w);
74         }
75         for (int i=0;i<k;i++)
76         {
77             addEdge(u+i*n,v+(i+1)*n,0);
78             addEdge(v+i*n,u+(i+1)*n,0);
79         }
80     }
81 
82     Dijkstra();
83 
84     ll ans=INF;
85     for (int i=1;i<=(k+1);i++)
86     {
87         ans=min(ans,t[i*n]);
88     }
89     cout<<ans<<endl;
90 
91     return 0;
92 }

 

posted @ 2021-12-04 21:27  Hell0er  阅读(57)  评论(0编辑  收藏  举报