Submission #1222723

#TimeUsernameProblemLanguageResultExecution timeMemory
1222723ByeWorldHotspot (NOI17_hotspot)C++20
100 / 100
523 ms1468 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #define int long long #define ll long long #define se second #define fi first #define pb push_back #define lf (id<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) #define ld long double using namespace std; typedef pair<int,int> pii; typedef pair<pii,pii> ipii; const int MAXN = 5010; const int SQRT = 450; const int INF = 2e9; const int MOD = 998244353; const int LOG = 20; int sum(int a, int b){ a%=MOD; b%=MOD; return (a+MOD+b)%MOD; } void chsum(int &a, int b){ a%=MOD; b%=MOD; a = (a+MOD+b)%MOD; } int mul(int a, int b){ return (a*b)%MOD; } int expo(int a, int b){ if(b==0) return 1; int te = expo(a, b/2); te = mul(te,te); return (b%2 ? mul(te,a) : te); } void chmul(int &a, int b){ a = (a*b)%MOD; } void chmn(auto &a, auto b){ a = min(a, b); } void chmx(auto &a, auto b){ a = max(a, b); } int n, m, dis[MAXN], dis2[MAXN], dp[MAXN], dp2[MAXN]; ld num[MAXN]; vector<int> adj[MAXN]; void dji(int sta, int en){ for(int i=1; i<=n; i++) dis[i] = INF, dp[i] = 0; queue <int> q; dis[sta] = 0; q.push(sta); dp[sta] = 1; while(!q.empty()){ int nw = q.front(); q.pop(); for(auto nx : adj[nw]){ if(dis[nx] > dis[nw]+1){ dp[nx] = dp[nw]; dis[nx] = dis[nw]+1; q.push(nx); } else if(dis[nx] == dis[nw]+1) dp[nx] += dp[nw]; } } for(int i=1; i<=n; i++) dis2[i] = INF, dp2[i] = 0; dis2[en] = 0; q.push(en); dp2[en] = 1; while(!q.empty()){ int nw = q.front(); q.pop(); for(auto nx : adj[nw]){ if(dis2[nx] > dis2[nw]+1){ dp2[nx] = dp2[nw]; dis2[nx] = dis2[nw]+1; q.push(nx); } else if(dis2[nx] == dis2[nw]+1) dp2[nx] += dp2[nw]; } } int way = dp[en]; // assert(way==1); for(int i=1; i<=n; i++){ if(dis[i]+dis2[i] == dis[en]){ num[i] += (ld)dp[i]*dp2[i]/way; } } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1; i<=m; i++){ int x, y; cin>>x>>y; x++; y++; adj[x].pb(y); adj[y].pb(x); } int k; cin>>k; for(int i=1; i<=k; i++){ int x, y; cin>>x>>y; x++; y++; dji(x, y); } int idx = 0; for(int i=1; i<=n; i++) if(num[idx] < num[i]) idx = i; cout << idx-1 << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...