poj - 1511 invitation cards
在乙個有向圖中,計算從1到n中每個結點的最少費用,然後再求n個結點(2~n)到1的最少費用
從第乙個結點到各個結點的最少費用 ——> 單源最短路徑
從各個結點到第乙個結點的最少費用 ——> 反向建圖 + 單源最短路徑
所以用 反向建圖 + 兩次dijkstra
#include #include #include #include #include using namespace std;
const int maxn = 1e6 + 10;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int t,n,r,head[maxn],head1[maxn],dis[maxn],dis2[maxn],cnt,cnt1;
struct edgee[maxn],re[maxn];
void add(int u,int v,int d)
void readd(int u,int v,int d)
struct node;
bool operator < (const node &x) const };
void dij()
dis[1] = 0;
q.push(node(1,0));
while(!q.empty())
} }}
void redij()
dis2[1] = 0;
q.push(node(1,0));
while(!q.empty())
} }}
int main()
dij();
redij();
for(int i = 1; i <= n; i++)
ans += dis[i] + dis2[i];
printf("%lld\n",ans);
} return 0;
}
poj - 3255 roadblocks
在無向圖中,求第1個結點到第n個結點的次短路,一條邊可以經過無數次
要麼是到第u個點是最短路,然後再加上u–>v這條邊
要麼是到第u個點是次短路,然後再加上u–>v這條邊
所以次短路是可以是由最短路+邊或者次短路+邊更新,所以我們需要將最短路與次短路都進入佇列,先更新最短路,然後再去更新次短路
#include #include #include #include #include using namespace std;
const int maxn = 2e5 + 10;
const int n = 6000;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int n,r,head[n],dis[n],dis2[n],cnt;
struct edgee[maxn];
void add(int u,int v,int d)
struct node
bool operator < (const node &x) const };
void dij()
dis[1] = 0;
q.push(node(1,0));
while(!q.empty())
if(dis2[y] > dt && dis[y] < dt)
} }
printf("%d\n",dis2[n]);
}int main()
dij();
return 0;
}
最短路 Dijkstra 堆優化 鏈式前向星
題目鏈結 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表...
poj1511 鏈式前向星 dijkstra堆優化
如果看題解往下划拉 這題網上說卡資料,只能鏈式前向星才能過?正好學一下鏈式前向星的處理 其實 這個和vector做的鄰接表差不多。可能用起來會快一點?不然這題鄰接表為啥過不了 我覺得dijkstra的堆優化和spfa算有非常強的關聯性 這裡提幾句 分析一下異同 spfa是一種基於bfs的單源最短路演...
dij堆優化 鏈式前向星 輸出路徑 模板
include include include include include using namespace std struct yyye 500100 2 前向星存圖 struct node 過載運算子實現小根堆 priority queue q stl 好 int tot,head 1001...