除看這道題,以為就是很簡單的二分+判斷負環
但是數次0分告訴我哪有你想的那麼簡單
我們在求最短路的過程中,應該把那些不同時滿足1.與起點聯通2.與終點聯通的點刪除。 一旦我們把這些點考慮進去,且這些點上還有負環時,對答案的影響就是致命的。
比如說這種情況
而如果終點不滿足上述條件,我們就可以直接輸出-1了。
#includeusingnamespace
std;
const
int n=105,m=10005,inf=0x3f3f3f3f
;int
h[n],e[m],ne[m],w[m];
inttot,n,m,t,dis[n];
bool vis[n],useful[n];//
useful表示是否同時滿足兩個約束條件
inline int
read()
while(ch>='
0'&&ch<='9'
)
return x*f;
}inline
void add(int a,int b,int
c)inline
void dfs(intx)}
inline
bool judge(int now,int x) //
判斷負環
}vis[now]=0
;
return
false;}
inline
void spfa(int
x) }
}}inline
bool check(int
x) spfa(x);
if(dis[n]>=0&&dis[n]<=inf) return
true
;
return
false;}
intmain()
memset(vis,
0,sizeof
(vis));
dfs(1);
for(int i=1;i<=n;i++)
if(vis[i]) useful[i]=1
;
for(int i=1;i<=n;i++)
if(useful[i])
if(!useful[n]) //
特判
while(l
printf(
"%d\n
",ans);
}return0;
}
ybtoj 二分演算法 最小時間
有n個物品,第i個物品有兩個屬性k,b,表示它在時刻 的價值為k x b。當前處於時刻0,你可以選擇不超過m個物品,使得存在非負整數時刻t,你選擇的所有物品的總價值大於等於s。給出s,求t的最小值。第一行三個整數n,m,s。接下來n行,第i行兩個整數k,b。一行乙個整數表示答案。3 2 100 3 ...
YbtOJ高效高階 二分 3 最大均值
ybtoj高效高階 二分 3 給定正整數序列a 求乙個平均數最大的,長度不小於 l 的 連續的 子段。10 66 4 21038 59 416500顯然二分 那要不然為啥是二分練習題呢 我們二分出這個平均值 然後把數列中每個數都減去這個平均值 然後找是否有一段長度不小於l的且和不為負數的數段即可 i...
sdut 二分練習
problem description 給你乙個序列,然後給你m個元素,讓你從序列中找出與每個元素最接近的數字輸出來,如果有兩個就輸出兩個。input 多組輸入,第一行給你兩個數n 0 n 10000000 m 0 m n 接下來是數列的n個數,然後再輸入m個元素,讓你找出最接近每個元素的值。如果有...