# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
51860 | someone_aa | 시간이 돈 (balkan11_timeismoney) | C++17 | 620 ms | 1904 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |