要做這題,先要明白圖的割,說白了就是 為了讓原點無法到匯點要刪幾條邊(之所以叫割,就是在圖面上切一刀,減掉最小的邊是原點和匯點成為兩個集合),想到了割先放著一會用。
題中說只有沿最短路走才有可能追上,那麼就意味著圖中的最短路可能不止一條,沿著最短路走才能追上,那麼其他的走法就沒用了,所以只要求原點到匯點的最短路徑圖的最小割就可以知道最少斷幾條邊可以堵住人了,再說第二問,既然最短路不止一條,那麼只要邊數量最小的一條最短路不被堵上,那個人就能追上炸彈張了,其他的邊都可以賭上一點問題沒有,這樣就是總點數-最小最短路邊數 等於第二問
寫完交了幾便都不對,逼的沒招了去和題解,結果發現建圖建錯了!真是二逼的可以、、、、、、、、、、
for(int i=1;i<=n;i++)
開始我是這麼寫的,後來我是這麼寫的
for(int u = 1; u <= n; u++)}}
啥區別呢? 錯的那個用了矩陣去訪問邊,但是點數和邊數差那麼多肯定是有重邊的! 矩陣不能存重邊!
ac**,看見有人216ms ac 我就四百多、、、
#include#include#include
#include
#include
#include
#define maxn 2001
#define inf 0xfffffff
using
namespace
std;
typedef pair
p;struct
edge
;vector
group[maxn];
vector
g[maxn];
intlevel[maxn],iter[maxn];
intdis[maxn],n,m,fro[maxn];
intvis[maxn],ans2;
intgg[maxn][maxn];
void
dijkstra()
dis[
1]=0
; priority_queue
, greater>que;
que.push(p(
0,1));
while(!que.empty())}}
}void addedge(int
from,int to,int
cap)
); group[to].push_back((edge));
}void
build()}}
/*for(int i=1;i<=n;i++)
void bfs(int
s) }
}}int dfs(int v,int t,int
f) }
}return0;
}int max_flow(int s,int
t) }
}int
minedge()}}
}return
fro[n];
}int
main()
); g[b].push_back((edge));
gg[a][b]=c;
gg[b][a]=c;
}for(int i=1;i<=maxn;i++)
group[i].clear();
dijkstra();
ans2=minedge();
build();
int ans1 = max_flow(1
,n);
printf(
"%d %d\n
",ans1,m-ans2);
}return0;
}
hdu 6299 多校第一場
題意 給出一些字串,重新組合,使括號的匹配數量最多 這道題場上沒能出,當時看了一眼,關於括號的,以為是個dp,就沒有再去做這道題。這道題事實上是個貪心,先把已經匹配好的括號數量統計出來。剩下的括號往兩邊堆,右括號往左邊堆,左括號往右邊堆。然後就是排序。左括號比右括號多的這種情況肯定要排在右括號比左括...
HDU6299(2018多校第一場)
bryce1010模板 兩個字串的排序可以分成四種情況 1 str1左少右多 vs str2 左多右少 str2排在str1前面 2 str1 左多右少 vs str2 左少右多 str1排在str2前面 3 str1 左少右多 vs str2 左少右多 按左括號的數量排序 4 其他情況按右括號的數...
2019HDU多校第一場
1002.operation 傳送 題意 給定乙個長度為 n 的數列,m 次操作,每次操作如下 0 l r 查詢區間 l,r 內若干個數的最大異或和。1 x 給數列末尾新增乙個數 x 資料範圍 1 n,m 5e5,1 a i 2 分析 開始直接考慮用線段樹維護區間線性基的並,然後每次查詢求區間線性基...