Edge Deletion
問題
E – Edge Deletion
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/3/13 解法わからず。
解法
- ワーシャルフロイドで(続きは後で書く)
コード例
#includeusing namespace std; #include using namespace atcoder; using ll = long long; using P = pair<nt, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; const int INF = 1001001001; struct Edge { ll from, to, cost; }; int main() { // N は頂点数、M は辺の数 ll N, M; cin >> N >> M; // 要素数はN + 1 // あらかじめ INF を入れておく vector > dist(301, vector (301)); for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(i != j) { dist[i][j] = INF; } } } // 頂点 u から頂点 v までの重みが c ll u, v; ll c; vector edges; for(int i = 0; i < M; i++) { cin >> u >> v >> c; u--; v--; dist[u][v] = c; dist[v][u] = c; Edge e; e.from = u; e.to = v; e.cost = c; edges.push_back(e); } // ワーシャルフロイドで全点間の距離を計算する for(int k = 0; k < N; k++) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } ll ans = 0; int n = edges.size(); for(int i = 0; i < n; i++) { int a = edges[i].from; int b = edges[i].to; int c = edges[i].cost; ll cnt = 0; for(int j = 0; j < N; j++) { if(j == a || j == b) { continue; } if(dist[a][j] + dist[j][b] <= c) { cnt = 1; } } ans += cnt; } cout << ans << endl; return 0; }