程式設計思維與實踐 Week7 作業

2021-10-05 03:43:12 字數 3875 閱讀 8236

眾所周知,tt 有乙隻魔法貓。

這一天,tt 正在專心致志地玩《貓和老鼠》遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?

魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝負關係,每個勝負關係為 a b,表示 a 能勝過 b,且勝負關係具有傳遞性。即 a 勝過 b,b 勝過 c,則 a 也能勝過 c。

tt 不相信他的小貓咪什麼比賽都能**,因此他想知道有多少對選手的勝負無法預先得知,你能幫幫他嗎?

本題需要求取勝負的傳遞閉包,使用floyd演算法即可。

#include

#include

#include

using

namespace std;

int dis[

510]

[510];

void

floyd

(int n)

intmain()

floyd

(n);

int ans =0;

for(

int i =

1; i <= n;

++i)

} cout << ans << endl;

}return0;

}

眾所周知,tt 有乙隻魔法貓。

今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。 tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車票,可以坐一站商業線。假設 tt 換乘的時間忽略不計,請你幫 tt 找到一條去喵星機場最快的線路,不然就要誤機了!

因為商業線只能坐一條,所以我們可以列舉每一條商業線,比較最短時間。

首先我們進行兩遍dij求出起點到任意點的最短路dis1,以及終點到任意點的最短路dis2。

之後列舉每一條商業線(u,v,w),取 min

min\

min,最後再與不乘坐商業線進行比較,即可獲得最快線路。

若乘坐商業線,在輸出路線時,我們採用回溯的方法輸出起點到u的路線(在dij時記錄到當前點的上乙個節點),再輸出v到終點的路線。

本題非常容易tle,vector存圖tle,用cin tle,cin關同步還是tle,就很難受。

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

struct edgeedge[

2010];

int head[

510]

,tot;

bool vis[

510]

;int p1[

510]

, p2[

510]

;int dis1[

510]

;int dis2[

510]

;int n;

void

add(

int x,

int y,

int w)

priority_queueint,

int>

> q;

void

dij(

int s,

int* dis,

int* p)}}

}void

out(

int x,

int s,

int* p)

out(p[x]

, s, p)

;printf

(" %d"

, x);}

void

out2

(int x,

int e,

int*p)

void

init()

intmain()

dij(s, dis1, p1)

;dij

(e, dis2, p2)

;scanf

("%d"

,&k)

;int minp = dis1[e]

, dx =

0, dy =0;

while

(k--)if

(dis1[y]

+ dis2[x]

+ z < minp)}if

(first) first =

false

;else

printf

("\n");

if(dx ==0)

else

printf

("%d\n"

, minp);}

return0;

}

這一晚,tt 做了個美夢!

在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 ~ n,其中 1 號城市是 tt 所在的城市,即首都。

喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出了乙個解決方案!tt 欣然接受並針對該方案頒布了一項新的政策。

具體政策如下:對每乙個商業城市標記乙個正整數,表示其繁榮程度,當每乙隻喵沿道路從乙個商業城市走到另乙個商業城市時,tt 都會收取它們(目的地繁榮程度 - 出發地繁榮程度)^ 3 的稅。

tt 打算測試一下這項政策是否合理,因此他想知道從首都出發,走到其他城市至少要交多少的稅,如果總金額小於 3 或者無法到達請悄咪咪地打出 『?』。

本題是乙個含負權邊的單源最短路徑問題,我們使用spfa來求取1號點到其餘點的最短路徑。當spfa中到達某乙個點所用邊數超過n-1時,說明存在負環,我們使用dfs將負環所能到達點都打上標記。

最後根據最短路是否小於3、是否在負環上(若在負環上,不存在最短路)、是否可到達(不可到達dis為inf)輸出答案。

#include

#include

#include

#include

#include

using

namespace std;

#define inf 1000000000

struct edge

;vector graph[

210]

;int t, n, m, ta, tb, q, tar;

int a[

210]

, dis[

210]

, inq[

210]

, cnt[

210]

;bool flag[

210]

;int

triple

(int a1,

int b1)

void

dfs(

int s)}}

void

spfa()

dis[1]

=0; inq[1]

=1; queue<

int> q;

q.push(1

);while

(!q.

empty()

)if(!inq[v]

&&!flag[v])}

}}}int

main()

spfa()

; cin >> q;

cout <<

"case "

<< case_i <<

":\n"

;while

(q--)}

return0;

}

程式設計思維與實踐 Week7 作業C SPFA

給定t組資料,每組資料有n個點和m條單向邊。每個點有乙個值,邊的權值即為終點的值減去起點值得三次方,求出從起點開始到每個點得最小權值和。由題意可知,圖中有負邊權,即有得點可能達不到,或者是處於負環路上。如果某個點不能達到或者是處於負環路,則輸出 第一行輸入 t,表明共有 t 組資料。1 t 50 對...

程式設計思維與實踐 Week2 作業

b題 倒水問題 bfs 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,...

程式設計思維與實踐 Week3 作業

b 區間選點 貪心 c 區間覆蓋問題 貪心 給出n個正數,從其中選出k個數,使其總和為s,問 有多少種選數方案?input 第一行是正數t t 100 表示測試的組數。每一組都輸入兩行,第一行是三個整數n,k,s,第二行是n個正整數。output 每一組輸出結果佔一行,為方案的數目。sample i...