SCU - 4444 別樣最短路徑-大資料完全圖
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=184147
Description
Travel
The country frog lives in has n towns which are conveniently numbered by 1,2,…,n.
Among n(n−1)2 pairs of towns, m of them are connected by bidirectional highway, which needs a minutes to travel. The other pairs are connected by railway, which needs b minutes to travel.
Find the minimum time to travel from town 1 to town n.
Input
The input consists of multiple tests. For each test:
The first line contains 4 integers n,m,a,b (2≤n≤105,0≤m≤5⋅105,1≤a,b≤109). Each of the following m lines contains 2integers ui,vi, which denotes cities ui and vi are connected by highway. (1≤ui,vi≤n,ui≠vi).
Output
For each test, write 1 integer which denotes the minimum time.
Sample Input
3 2 1 3
1 2
2 3
3 2 2 3
1 2
2 3
Sample Output
2
3
/**
SCU - 4444 別樣最短路徑-大資料完全圖
題目大意:給定一個完全圖,其中有兩種邊,長度為a(不超過5e5)或長度為b(剩下的),求有1~n的最短路徑(資料範圍1e5)
解題思路:如果1和n之間連邊為a那麼答案一定為a和一條最短的全由b組成的路徑的較小者,如果1和n之間連邊為b,那麼答案一定
為b和一條最短的全由a組成的路徑的較小者。對於第1種情況直接跑spfa就可以了,第二種情況由於邊數較多,不能直接spfa
從1開始搜尋與其相連的邊權為b的邊,用set維護一下,由於每個點只入隊1次,複雜度還是允許的。這種處理方法還是第一
次做,感覺很巧妙
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
const int maxn=100100;
int n,m,vis[maxn];
LL a,b,dis[maxn];
set<int>st,ts;
set<int>::iterator it;
int head[maxn],ip;
void init()
{
memset(head,-1,sizeof(head));
ip=0;
}
struct note
{
int v,next;
}edge[maxn*10];
void addedge(int u,int v)
{
edge[ip].v=v,edge[ip].next=head[u],head[u]=ip++;
}
void spfa()
{
queue<int>q;
for(int i=0;i<=n;i++)dis[i]=INF;
memset(vis,0,sizeof(vis));
dis[1]=0;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
printf("%lld\n",min(dis[n]*a,b));
}
void bfs()
{
dis[n]=INF;
st.clear(),ts.clear();
for(int i=2;i<=n;i++)st.insert(i);
queue<int>q;
q.push(1);
dis[1]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(st.count(v)==0)continue;
st.erase(v),ts.insert(v);
}
for(it=st.begin();it!=st.end();it++)
{
q.push(*it);
dis[*it]=dis[u]+1;
}
st.swap(ts);
ts.clear();
}
printf("%lld\n",min(dis[n]*b,a));
}
int main()
{
while(~scanf("%d%d%lld%lld",&n,&m,&a,&b))
{
init();
int flag=0;
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(u>v)swap(u,v);
addedge(u,v);
addedge(v,u);
if(u==1&&v==n)flag=1;
}
if(flag)bfs();
else spfa();
}
return 0;
}
相關文章
- 演算法與資料結構之-圖的最短路徑演算法資料結構
- 資料結構學習(C++)——圖【4】(最短路徑) (轉)資料結構C++
- DS圖—圖的最短路徑(不含程式碼框架)框架
- 4444
- 圖的最短路徑演算法彙總演算法
- 最短路徑問題
- 圖論-BFS解無權有向圖最短路徑距離圖論
- 圖的單源最短路徑(Dijkstra演算法)演算法
- 圖論最短路徑問題與matlab實現圖論Matlab
- 矩陣求最短路徑矩陣
- 最短路徑演算法演算法
- QOJ #8673. 最短路徑
- 資料結構------最短路徑Dijkstra和最小生成樹Prim資料結構
- 圖 - 每對頂點間最短路徑----Floyd演算法演算法
- 資料結構和演算法學習筆記九:最短路徑資料結構演算法筆記
- 資料結構 最短路徑之—迪傑斯特拉演算法資料結構演算法
- 最短路徑(Floyd演算法)演算法
- Djikstra最短路徑演算法演算法
- 大資料專家:大資料7大最奇特應用大資料
- 大資料圖大資料
- 最短路徑(Dijskra演算法)JS演算法
- 最短路徑演算法總結演算法
- 最短路徑之Floyd演算法演算法
- 演算法:最短路徑問題演算法
- HDU3665Seaside(最短路徑)IDE
- 大資料大利潤–資料資訊圖大資料
- 最短路圖論圖論
- 圖論系列之「廣度優先遍歷及無權圖的最短路徑(ShortPath)」圖論
- 大資料框架圖大資料框架
- 2024_4_22 路徑花費為最長$k$條邊之和最短路
- 動態規劃之最短路徑和動態規劃
- [MATLAB]最短路徑Floyd演算法Matlab演算法
- 幾個最短路徑的演算法演算法
- 最短路徑之Dijkstra演算法演算法
- SQL Server與最短路徑演算法SQLServer演算法
- 獲取所有鑰匙的最短路徑
- Floyd演算法(計算最短路徑)演算法
- 最簡大資料Spark-2.1.0大資料Spark