UVA 11374 SPFA 路徑列印

2021-08-11 04:32:42 字數 1360 閱讀 4196

有廉價線路和普通線路,只有一次乘坐普通線路的機會,問從s到e花費最少的線路。並輸出路徑。

由於只有一次機會,因此可以直接列舉乘坐的普通線路。針對每次選擇,兩遍spfa(列舉正向和反向)。至於輸出路徑,只需要記錄每個點的最短路徑上乙個點就可以了。輸出的時候遞迴輸出就可以了。

#include

#define ll long long

#define up(i,l,h) for(int i=l;i#define down(i,h,l) for(int i=h-1;i>=l;i--)

#define w(t) while(t)

#define mem(a,b) memset(a,b,sizeof(a))

#define inf 0x3f3f3f3f

#define maxn 510

#define cout(x) cout<#pragma comment(linker, "/stack:102400000,102400000")

using

namespace

std;

struct node

bool

operator == (node b) const

};vector

vc[maxn];

bool vis[maxn];

int dis[maxn],f[maxn],ansf[maxn];

int n,s,e;

void spfa(int x)}}

}}void print(int now)else

printf("%d ",now);

}int main()

scanf("%d",&k);

spfa(s);

int ans=dis[e];

// cout(ans);

memcpy(ansf,f,sizeof(f));

up(i,0,k)

// cout("dis"mem(dis,inf);

vc[y].push_back(node(x,w));

spfa(s);

it=find(vc[y].begin(),vc[y].end(),node(x,w));

vc[y].erase(it);

if(dis[e]memcpy(ansf,f,sizeof(f));

}// cout("dis"<}

print(e);

if(use==-1) puts("ticket not used");

else

printf("%d\n",use);

printf("%d\n",ans);

}}

UVA11374機場快線題目學習

學習 演算法競賽入門經典訓練指南 思考 機場快線 1.對起點和終點呼叫dijkstra 2.列舉所有的商業線 包含沒有使用商業線車票 計算從起點到a,a b,b 終點,並與最小做對比 考慮到所有線路都是雙向的,需要比較兩次 3.列印出訪問順序給出經過的車站。可能需要用到路徑尋找函式find 對於函式...

天路(01規劃 SPFA判負環)

傳送門 公式來自洛谷題解 因為求v之和與p之和的比值的最大值。這個值不超過200 考慮到二分答案,設ans為最大值,則有 可以看出是01分數規劃 那麼每次就重新分配邊的權值 ans ci vi 再判負環,有說明ans不成立,反之成立。特別提一下 這裡判負環是用dfs版的spfa,而不是bfs版的,d...

UVA10917 路徑統計

求s到t特殊路徑統計,路徑上每條邊滿足dt u dt v dt i 是i到達t的最短路。滿足dt u t的路徑數目 1.統計dag圖上任意一點到達t的路徑數目 num i i到達t的路徑數目,由dag圖的dp性質,num u num v v是u的後繼。void dfs int u,int t vec...