結果
| 問題 |
No.748 yuki国のお財布事情
|
| コンテスト | |
| ユーザー |
algon_320
|
| 提出日時 | 2018-10-19 22:13:10 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 78 ms / 2,000 ms |
| コード長 | 3,059 bytes |
| コンパイル時間 | 2,190 ms |
| コンパイル使用メモリ | 180,772 KB |
| 実行使用メモリ | 12,160 KB |
| 最終ジャッジ日時 | 2024-11-18 21:01:23 |
| 合計ジャッジ時間 | 4,088 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define stoi stoll
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
#define ALL(c) begin(c),end(c)
#define RALL(c) rbegin(c),rend(c)
#define ITR(i,b,e) for(auto i=(b);i!=(e);++i)
#define FORE(x,c) for(auto &x:c)
#define REPF(i,a,n) for(int i=a,i##len=(int)(n);i<i##len;++i)
#define REP(i,n) REPF(i,0,n)
#define REPR(i,n) for(int i=(int)(n);i>=0;--i)
#define SZ(c) ((int)c.size())
#define CONTAIN(c,x) (c.find(x)!=end(c))
#define INSEG(l,x,r) ((l)<=(x)&&(x)<(r))
#define dump(...)
#define pb push_back
#define _ 0
const signed INF_=1001001001; const long long INF=1001001001001001001LL;
const int DX[9]={0,1,0,-1,1,1,-1,-1,0},DY[9]={-1,0,1,0,-1,1,1,-1,0};
template<class T> ostream& operator<<(ostream &os,const vector<T> &v) {
ITR(i,begin(v),end(v))os<<*i<<(i==end(v)-1?"":" ");return os;}
template<class T> istream& operator>>(istream &is,vector<T> &v) {
ITR(i,begin(v),end(v)) is>>*i;return is;}
template<class T,class U> istream& operator>>(istream &is, pair<T,U> &p) {
is>>p.first>>p.second;return is;}
template<class T, class U> bool chmax(T &a,const U &b){return a<b?a=b,1:0;}
template<class T, class U> bool chmin(T &a,const U &b){return a>b?a=b,1:0;}
template <class T> void PSUM(T& c) {partial_sum(begin(c), end(c), begin(c));}
template<class T> using heap=priority_queue<T,vector<T>,greater<T>>;
struct before_main_function {
before_main_function() {
cin.tie(0); ios::sync_with_stdio(false);
cout << setprecision(15) << fixed;
#define endl "\n"
}
} before_main_function;
//------------------8<------------------------------------8<--------------------
struct union_find {
vector<int> data;
union_find(int size) : data(size, -1) {}
void unite(int x, int y) {
x = root(x); y = root(y);
if(x != y) {
if(data[y] < data[x]) swap(x, y);
data[x] += data[y];
data[y] = x;
}
}
bool same(int x, int y) {
return root(x) == root(y);
}
int root(int x) {
return data[x] < 0 ? x : (data[x] = root(data[x]));
}
int size(int x) {
return -data[root(x)];
}
};
signed main() {
int N, M, K;
cin >> N >> M >> K;
vector<vi> edge(M);
union_find uf(N);
REP(i, M) {
int a, b, c;
cin >> a >> b >> c;
a--, b--;
edge[i] = {c, a, b};
}
int ans = 0;
REP(i, K) {
int e;
cin >> e;
e--;
int c = edge[e][0];
int a = edge[e][1];
int b = edge[e][2];
ans += c;
uf.unite(a, b);
edge[e].pb(1);
}
sort(ALL(edge));
REP(i, SZ(edge)) {
if (SZ(edge[i]) == 4) continue;
int c = edge[i][0];
int a = edge[i][1];
int b = edge[i][2];
if (!uf.same(a, b)) {
ans += c;
uf.unite(a, b);
}
}
int total = 0;
REP(i, M) total += edge[i][0];
cout << (total - ans) << endl;
return (0^_^0);
}
algon_320