眾所周知,tt 有乙隻魔法貓。
這一天,tt 正在專心致志地玩《貓和老鼠》遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?
魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝負關係,每個勝負關係為 a b,表示 a 能勝過 b,且勝負關係具有傳遞性。即 a 勝過 b,b 勝過 c,則 a 也能勝過 c。
tt 不相信他的小貓咪什麼比賽都能**,因此他想知道有多少對選手的勝負無法預先得知,你能幫幫他嗎?
本題需要求取勝負的傳遞閉包,使用floyd演算法即可。
眾所周知,tt 有乙隻魔法貓。#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;
}
今天他在 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,就很難受。
這一晚,tt 做了個美夢!#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 的願望成真了,他成為了喵星的統領!喵星上有 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...