Submission #51860

#TimeUsernameProblemLanguageResultExecution timeMemory
51860someone_aa시간이 돈 (balkan11_timeismoney)C++17
65 / 100
620 ms1904 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define mp make_pair using namespace std; const int maxe = 10100; const int maxn = 210; ll st[maxe], fh[maxe], ti[maxe], co[maxe]; ll edgevalue[maxe], n, m, value[maxe]; bool criticaledge[maxe]; bool edge[maxn][maxn]; bool visited[maxn]; bool deleted[maxe]; vector<int>g[maxn]; void dfs(int node) { if(visited[node]) return; visited[node] = true; for(int u:g[node]) { if(!visited[u] && edge[node][u]) { dfs(u); } } } bool iscritical(int ind) { if(criticaledge[ind]) return true; edge[st[ind]][fh[ind]] = edge[fh[ind]][st[ind]] = false; memset(visited,false,sizeof(visited)); dfs(1); edge[st[ind]][fh[ind]] = edge[fh[ind]][st[ind]] = true; int br = 0; for(int i=0;i<n;i++) if(visited[i]) br++; if(br == n) { criticaledge[ind] = false; return false; } else return criticaledge[ind] = true; } int main() { cin>>n>>m; ll u, v, t, c; ll sumtime = 0LL; ll sumcost = 0LL; for(int i=0;i<m;i++) { cin>>u>>v>>t>>c; st[i] = u; fh[i] = v; ti[i] = t; co[i] = c; g[u].pb(v); g[v].pb(u); edge[u][v] = edge[v][u] = true; sumtime += ti[i]; sumcost += co[i]; } int edgecnt = m; while(edgecnt > n-1) { ll maxvalue = 0LL, maxind = 0; for(int i=0;i<m;i++) { value[i] = (1LL*ti[i]*sumcost)+(1LL*co[i]*sumtime); if(!criticaledge[i]) { if(value[i] > maxvalue) { maxvalue = value[i]; maxind = i; } } } while(iscritical(maxind)) { maxvalue = 0LL; maxind = 0; for(int i=0;i<m;i++) { if(!criticaledge[i]) { if(value[i] > maxvalue) { maxvalue = value[i]; maxind = i; } } } } edge[st[maxind]][fh[maxind]]=edge[fh[maxind]][st[maxind]]=false; sumcost -= co[maxind]; sumtime -= ti[maxind]; co[maxind] = 0; ti[maxind] = 0; edgecnt--; } cout<<sumtime<<" "<<sumcost<<"\n"; for(int i=0;i<m;i++) { if(edge[st[i]][fh[i]]) cout<<st[i]<<" "<<fh[i]<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...