結果
問題 | No.748 yuki国のお財布事情 |
ユーザー |
![]() |
提出日時 | 2019-08-24 11:36:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 68 ms / 2,000 ms |
コード長 | 4,308 bytes |
コンパイル時間 | 1,670 ms |
コンパイル使用メモリ | 175,960 KB |
実行使用メモリ | 16,124 KB |
最終ジャッジ日時 | 2024-10-13 15:03:08 |
合計ジャッジ時間 | 3,382 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef int64_t i64;typedef uint64_t ui64;class djset{private:int sz;int *par;public:djset(int n){sz=n;par=new int[sz];for(int i=0;i<sz;i++) par[i]=1;}int find(int x){return par[x]<=0?-(par[x]=-find(-par[x])):x;}void unite(int x,int y){int px=find(x),py=find(y);if(px==py) return;if(par[px]<par[py]){int tmp=px;px=py;py=tmp;}par[px]+=par[py];par[py]=-px;}bool same(int x,int y){return (find(x)==find(y));}int size(int x){return par[find(x)];}int group(void){int cnt=0;for(int i=0;i<sz;i++){if(par[i]>0) cnt++;}return cnt;}void refr(void){delete[] par;}};class graph{private:struct vrtx{int to;int64_t cost;};struct adj{int start;int to;int64_t cost;};int nd;int edg;std::vector<vrtx> *node;std::vector<adj> edge;public:graph(int n,int m){nd=n;edg=m;node=new std::vector<vrtx>[nd];}void add_dir(int s,int t,int64_t c){node[s].push_back({t,c});edge.push_back({s,t,c});}void add_undir(int s,int t,int64_t c){node[s].push_back({t,c});node[t].push_back({s,c});edge.push_back({s,t,c});}void dlt_dir(int s,int t){for(int i=0;i<node[s].size();i++){if(node[s][i].to==t){node[s].erase(node[s].begin()+i);break;}}}void dlt_undir(int s,int t){for(int i=0;i<node[s].size();i++){if(node[s][i].to==t){node[s].erase(node[s].begin()+i);break;}}for(int i=0;i<node[t].size();i++){if(node[t][i].to==s){node[t].erase(node[t].begin()+i);break;}}}void refr(void){for(int i=0;i<nd;i++) std::vector<vrtx>().swap(node[i]);delete[] node;std::vector<adj>().swap(edge);}bool islnk(void);void dfs(int r,int64_t **p,bool **vst); // 木, (*p)[], vst[] を呼び出す前に初期化bool ispls(void);void bellford(int s,int64_t **d);void dijkstra(int s,int64_t **d); // 負の閉路なしvoid bfs(int s,int64_t **d); // 辺に重み無し or 木void waflo(bool isdir,int64_t ***d);int64_t minstw_dir(int r); // class: djset, class: skewheap が必要int64_t minstw_undir(void); // class: djset が必要void edmonds(int r,std::vector<std::pair<int,int>> &p); // class: djset, class: skewheap が必要void kruscal(std::vector<std::pair<int,int>> &p); // class: djset が必要void prim(std::vector<std::pair<int,int>> &p);void cumulsum(int s,int64_t **d); // 木void cumulprd(int s,int64_t **d); // 木};int64_t graph::minstw_undir(void){adj *es=new adj[edg];for(int i=0;i<edg;i++) es[i]={edge[i].start,edge[i].to,edge[i].cost};std::sort(es,es+edg,[](const adj &e1,const adj &e2){return e1.cost<e2.cost;});djset uf(nd);int64_t res=0;for(int i=0;i<edg;i++){if(!uf.same(es[i].start,es[i].to)){uf.unite(es[i].start,es[i].to);res+=es[i].cost;}}return res;}int main(void){int n,m,k;scanf("%i%i%i",&n,&m,&k);graph g(n,m);int *a=new int[m],*b=new int[m];i64 *c=new i64[m];int *e=new int[k];i64 sum=0;for(int i=0;i<m;i++){scanf("%i%i%lli",&a[i],&b[i],&c[i]);a[i]--;b[i]--;sum+=c[i];}if(k==0){for(int i=0;i<m;i++) g.add_undir(a[i],b[i],c[i]);printf("%lli\n",sum-g.minstw_undir());return 0;}for(int i=0;i<k;i++){scanf("%i",&e[i]);e[i]--;}int j=0;i64 need=0;for(int i=0;i<m;i++){if(i!=e[j]) g.add_undir(a[i],b[i],c[i]);else{need+=c[i];g.add_undir(a[i],b[i],0);j++;}}printf("%lli\n",sum-g.minstw_undir()-need);return 0;}