NOI2014 魔法森林

2022-03-27 10:56:05 字數 2609 閱讀 1619

為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為1..n,邊標號為1..m。初始時小e同學在號節點1,隱士則住在號節點n。小e需要通過這一片魔法森林,才能夠拜訪到隱士。

魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條邊上的妖怪就會對其發起攻擊。幸運的是,在號節點住著兩種守護精靈:a型守護精靈與b型守護精靈。小e可以借助它們的力量,達到自己的目的。

只要小e帶上足夠多的守護精靈,妖怪們就不會發起攻擊了。具體來說,無向圖中的每一條邊ei包含兩個權值ai與bi。若身上攜帶的a型守護精靈個數不少於ai,且b型守護精靈個數不少於bi,這條邊上的妖怪就不會對通過這條邊的人發起攻擊。當且僅當通過這片魔法森林的過程中沒有任意一條邊的妖怪向小e發起攻擊,他才能成功找到隱士。

由於攜帶守護精靈是一件非常麻煩的事,小e想要知道,要能夠成功拜訪到隱士,最少需要攜帶守護精靈的總個數。守護精靈的總個數為a型守護精靈的個數與b型守護精靈的個數之和。

第1行包含兩個整數n,m,表示無向圖共有n個節點,m條邊。 接下來m行,第行包含4個正整數xi,yi,ai,bi,描述第i條無向邊。其中xi與yi為該邊兩個端點的標號,ai與bi的含義如題所述。 注意資料中可能包含重邊與自環。

輸出一行乙個整數:如果小e可以成功拜訪到隱士,輸出小e最少需要攜帶的守護精靈的總個數;如果無論如何小e都無法拜訪到隱士,輸出「-1」(不含引號)。

4 51 2 19 1

2 3 8 12

2 4 12 15

1 3 17 8

3 4 1 17

32如果小e走路徑$1\rightarrow 2\rightarrow 4$,需要攜帶$19+15=34$個守護精靈

如果小e走路徑$1\rightarrow 3\rightarrow 4$,需要攜帶$17+17=34$個守護精靈

如果小e走路徑$1\rightarrow 2\rightarrow 3\rightarrow 4$,需要攜帶$19+17=36$個守護精靈

如果小e走路徑$1\rightarrow 3\rightarrow 2\rightarrow 4$,需要攜帶$17+15=32$個守護精靈

綜上所述,小e最少需要攜帶32個守護精靈

這題1a還被懷疑,我玩個鬼,要是不練1a能力,我考試咋玩啊

這題是個很簡單的spfa,首先我們看,每條邊有兩個值,那麼我們顯然不能一起考慮,所以我們想,能否先確定乙個值,然後用該值去確定另乙個值,從而得到最優解?

顯然可以。

我們可以先以a為關鍵字從小到大的列舉,讓每一條邊的a值都做一次最小的a值,將所有小於等於a的邊加入圖中,跑spfa,找出在該條件下到n所需的b值,不斷更新ans,直到最終更新出最優解

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 inline int

read()

14struct

line

19 }l[100005

];20

intttt;

21struct

edge

25 }a[100005

];26

inttot;

27 edge *pre[50005

];28

bool vis[50005

];29

int dis[50005

];30

struct

node

35}tmp,now;

36 priority_queueq;

37 inline void insert(int s,int e,int

w)43 inline void add(int s,int e,int a,int

b)49 inline void

spfa()65}

66}67}

68}69int

n,m;

70 inline int

gg()

81 sort(l+1,l+m+1

);82 dis[1]=0,vis[1]=1

;83 tmp.id=1;84

q.push(tmp);

85for(int i=1;i<=m;i++)

99if(!vis[e])

104}

105else

106break

;107

spfa();

108 ans=min(ans,dis[n]+op);

109 i=j-1

;110

}111

if(ans==inf)

112 puts("-1"

);113

else

114 printf("%d"

,ans);

115}

116int

k(gg());

117int main()

view code

在cogs上rk1,然後在hzoj上t了= =,結果一調,鄰接錶開小了= =

我。。。

NOI2014 魔法森林

為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為 1 n 邊標號為1 m 初始時小e同學在 1 號節點,隱士則住在 n 號節點。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有人經過一條邊的...

NOI2014 魔法森林

為了得到書法大家的真傳,小 e 同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含 n 個節點 m 條邊的無向圖,節點標號為1,2,3,n,邊標號為 1,2,3,m。初始時小 e 同學在 1 號節點,隱士則住在 n 號節點。小 e 需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中...

NOI2014 魔法森林

noi2014 魔法森林 要求a 與 b 的總和最小 可以按a排序 再以b為權值維護一顆樹 lct維護最小生成樹 要解決的問題 將每一條邊變為乙個點 邊權變為點權 舉個栗子 u v有一條邊權為w的邊 怎lct連邊方式為 u new v new的點權為w 不斷維護最小生成樹 如果新加入的邊的 u與v不...