ACM-ICPC 2018 南京賽區網路預賽__L. Magical Girl Haze 【Dijkstra演算法+分層圖思想】
- 1000ms
- 262144K
There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a distance ci. Haze is a Magical Girl that lives in City 1, she can choose no more than K roads and make their distances become 0. Now she wants to go to City N, please help her calculate the minimum distance.
Input
The first line has one integer T(1≤T≤5), then following T cases.
For each test case, the first line has three integers N,M and K.
Then the following M lines each line has three integers, describe a road, Ui,Vi,Ci. There might be multiple edges between u and v.
It is guaranteed that N≤100000,M≤200000,K≤10,
0 ≤Ci≤1e9. There is at least one path between City 1 and City N.
Output
For each test case, print the minimum distance.
樣例輸入
1
5 6 1
1 2 2
1 3 4
2 4 3
3 4 1
3 5 6
4 5 2
樣例輸出
3
題目來源
題目大意:有N個城市,M條有向邊,城市之間可能有多條邊,你可以選擇讓至多K條邊的長度變為0,問最好的情況下,城市1到城市N的最短路徑為多少
題解:Dijkstra演算法+分層圖思想,具體看程式碼來理解分層圖思想
AC的C++程式碼:
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=100003;
struct Edge{//邊
int v,w;//起點到終點v的花費為w
Edge(int v,int w):v(v),w(w){}
};
struct Node{
int u;
int w;
Node(){}
Node(int u,int w):u(u),w(w){}
bool operator<(const Node &a)const//使用優先佇列,故將<過載為大於含義
{
return w>a.w;
}
};
vector<Edge>g[N];
ll dist[N][11];//dist[i][j]表示在使得j條邊為0的情況下源點到結點i的最短路
bool vis[N][11];
void dijkstra(int s,int n,int k)//源點為s,共有n個結點 可以選擇k條邊為0
{
priority_queue<Node>q;
memset(vis,false,sizeof(vis));
memset(dist,INF,sizeof(dist));
dist[s][0]=0;
q.push(Node(s,0));
while(!q.empty()){
Node e=q.top();
q.pop();
int z=e.u/(n+1);//z表示使z條邊的長度為0
int u=e.u%(n+1);//u表示當前結點編號
if(!vis[u][z]){//如果還未用dist[u][z]更新其他狀態就進行更新
vis[u][z]=true;
int num=g[u].size();//與u相連的點有num個
for(int i=0;i<num;i++){
int v=g[u][i].v;//v為與u相連的點
if(vis[v][z])//如果dist[u][z]已經得到了就跳過
continue;
int c=g[u][i].w;//c表示結點u到結點v的距離
//選擇1:不讓這條邊為0
if(dist[v][z]>dist[u][z]+c){
dist[v][z]=dist[u][z]+c;
/*第一個引數 z*(n+1)+v是為了使得z可以通過e.u/(n+1)得到,u可以
通過e.u%(n+1)得到 */
q.push(Node(z*(n+1)+v,dist[v][z]));
}
if(z==k)//如果已經使k條邊為0,就跳過
continue;
//選擇2:讓這條邊為0,則dist[v][z]變為dist[v][z+1]因為多讓一條邊變為0
if(dist[v][z+1]>dist[u][z]){
dist[v][z+1]=dist[u][z];
q.push(Node((z+1)*(n+1)+v,dist[v][z+1]));
}
}
}
}
}
int main()
{
int t,n,m,a,b,k,c;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=n;i++)
g[i].clear();
while(m--){
scanf("%d%d%d",&a,&b,&c);
g[a].push_back(Edge(b,c));
}
dijkstra(1,n,k);
printf("%lld\n",dist[n][k]);
}
return 0;
}
相關文章
- 2018icpc 南京網路賽L Magical Girl Haze
- ACM-ICPC 2018 南京賽區網路預賽__B The writing on the wall【列舉】ACM
- ACM-ICPC 2018 徐州賽區網路預賽ACM
- ACM-ICPC 2018 瀋陽賽區網路預賽ACM
- ACM-ICPC 2018 南京賽區網路預賽__E AC Challenge【狀態壓縮+DP】ACM
- ACM-ICPC 2018 徐州賽區網路預賽 F. Features TrackACM
- ACM-ICPC 2018 南京賽區網路預賽__K The Great Nim Game【博弈論+費馬小定理+DP】ACMGAM
- ACM-ICPC 2018 南京賽區網路預賽 __G Lpl and Energy-saving Lamps【線段樹+模擬】ACMLAMP
- ACM-ICPC 2018 南京賽區網路預賽__J. Sum【尤拉篩法+質因子分解+思維】ACM
- ACM-ICPC 2018 徐州賽區網路預賽 I. Characters with Hash【簽到題】ACM
- 2018 瀋陽賽區網路預賽 I.Lattice's basics in digital electronics(模擬)Git
- 2018 北京賽區網路預選賽 A. Saving Tang Monk II(BFS+優先佇列)佇列
- 2018 ICPC南京區域賽題解 更新至 8 題
- 2018 徐州網路賽 G 題解
- 第43屆ACM-ICPC國際大學生程式設計競賽 亞洲區域賽南京站現場賽名額分配相關說明ACM程式設計
- 2018華為網路技術大賽
- 為加快南京AI產業發展,2018全球(南京)人工智慧應用大賽現公開徵集賽題原型AI產業人工智慧原型
- 沙漠or綠洲,從南京軟博會I.D.Spark網際網路創新大賽看南京網際網路發展Spark
- 2024 ICPC 網路預選賽 第 2 場
- (演算法競賽)簡單易懂二分圖演算法
- 計蒜客:騎車比賽(Dijkstra)
- 2019ICPC南京網路賽B super_log——擴充套件尤拉定理套件
- 2018 icpc徐州站網路賽 H Ryuji doesn't want to study
- 2018王者榮耀KPL秋季賽賽程表 2018王者榮耀KPL秋季賽賽制
- 第 43 屆 ACM-ICPC 亞洲區域賽(徐州)現場賽名額分配規則及相關說明ACM
- ACM-ICPC 2018 決賽落幕,中國戰隊一金兩銀戰績收官ACM
- 新生賽及預選賽 10
- 2024春秋杯網路安全聯賽夏季賽-PWN-Writeup
- 2016中國“網際網路+”創業創新大賽(西北+山西)賽區決賽成功舉辦 優秀專案將會師海口...創業
- 2016中國“網際網路+”創業創新大賽(西北+山西)賽區決賽成功舉辦優秀專案將會師海口創業
- 2024中國工業網際網路安全大賽智慧家電行業賽道選拔賽行業
- 2024ccpc網路賽補題
- 前端架構思想:聚類分層前端架構聚類
- 2021年春秋杯網路安全聯賽秋季賽 勇者山峰部分wp
- 【JAVA演算法】圖論演算法 -- Dijkstra演算法Java演算法圖論
- 中新賽克工業網際網路安全產品強勢入圍《中國網路安全全景圖》5大細分領域
- 新興科技+網際網路創新大賽,科技+社會公益專項賽
- 第八屆“網際網路+”大賽 | 雲原生賽道邀你來挑戰