這題最終的意思很簡單,輸入圖,求出從源點到所有點的最短路,再把這個圖的所有邊反向,再求一次源點到所有點的最短路。
這個和poj另一道題很相似,合適這題 的意義在於資料。
你這個圖是無法用鄰接矩陣存下的,因為鄰接矩陣太大了,你只能用鄰接表。
那麼這個題就是用鄰接表的用優先佇列優化過的dijstra過的了。
(其實堆優化就是用優先佇列而已,不和那些人裝樣子……)
注意這個圖的所有邊反向是怎麼實現的。
ac**:
#include #include #include #include #include using namespace std;
const int maxe=1e6+10;
const int maxv=1e6+10;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n,m;
int restore[maxe][3];
int which=1;
int head[maxv];
struct edge
}e[maxv];
void add(int s, int d,int w)
void initforgraph()
struct pnwdis
};int dis[maxv];
void dijstra(int st)}}
}}void print()
printf("\n");
}int main()
dijstra(1);
for(int i=1;i<=n;i++)
ans+=dis[i];
initforgraph();
which=1;
for(int i=1;i<=m;i++)
dijstra(1);
for(int i=1;i<=n;i++)
ans+=dis[i];
cout<
貼個模板,POJ 1511
n個點m條邊,有向圖,求1到其餘各點的最短距離與各點到1的距離最短的路徑總和。n m 1e6 樸素必跪。dijkstra堆優化和spfa應該都能過。因為是有向圖,求1到各點的距離,直接原圖上跑spfa。求各點回到1的距離,將邊反轉 from變to to 變from 在新圖上再跑一遍spfa。8s的題...
POJ 1511 最短路徑
include include include using namespace std const int maxn 1000005 struct node node mat1 maxn mat2 maxn queueq node pool maxn 2 2 int counts long long...
POJ 1511 雙向單源最短路 SPFA 鄰接表
最近在複習最短路演算法 然後今天在看差分約束系統的時候看到了這一題poj 1511 題目的大意 給出n個點和n條有向邊,求所有點到源點1的來回最短路之和 保證每個點都可以往返源點1 題目意思很簡單,但是資料規模很大,當時知道資料規模很大,用一般的方法肯定會超時或者其他錯誤,但是還是用基礎的方法寫了一...