QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#51002 | #853. Flat Organization | tricyzhkx | WA | 29ms | 6308kb | C++14 | 2.4kb | 2022-09-30 09:13:29 | 2022-09-30 09:13:30 |
Judging History
answer
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int du[2010],id[2010],d[2010][2010],pre[2010],g[2010][2010],dfn[2010],low[2010],sz[2010],inscc[2010],tot,scc_tot;
ll dis[2010];
bool vis[2010];
vector<int> G[2010],G2[2010];
stack<int> stk;
queue<int> que;
void tarjan(int u)
{
dfn[u]=low[u]=++tot;
stk.push(u);
for(int v:G[u])
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(!inscc[v]) low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u])
{
int w;scc_tot++;
do
{
w=stk.top();stk.pop();
sz[scc_tot]++;
inscc[w]=scc_tot;
}while(w!=u);
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&d[i][j]);
if(n==1){puts("YES\n0 0");continue;}
if(n==2){puts("NO");continue;}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]>0) G[i].push_back(j);
tot=scc_tot=0;
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]>0 && inscc[i]!=inscc[j])
du[inscc[j]]++,G2[inscc[i]].push_back(inscc[j]);
int st=0,ed=0,cnt=0;
for(int i=1;i<=scc_tot;i++)
if(!du[i]) que.push(i),st=i;
while(!que.empty())
{
int u=que.front();que.pop();
ed=u;id[u]=++cnt;
for(int v:G2[u])
if(!(--du[v])) que.push(v);
}
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
g[i][j]=1e9;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]>0)
{
g[i][j]=0;
if(inscc[i]==inscc[j]) continue;
g[j][i]=d[i][j];
}
for(int i=1;i<=n;i++)
{
if(inscc[i]==ed) g[0][i]=0;
if(inscc[i]==st) g[i][n+1]=0;
}
for(int i=1;i<=n+1;i++) dis[i]=1e18,vis[i]=0;
dis[0]=0;vis[0]=0;
for(int i=1;i<=n+2;i++)
{
int u=-1;
for(int j=0;j<=n+1;j++)
if(!vis[j] && (u<0 || dis[j]<=dis[u])) u=j;
assert(u>=0);vis[u]=1;
if(u==n+1) break;
for(int v=0;v<=n+1;v++)
if(dis[v]>dis[u]+g[u][v])
dis[v]=dis[u]+g[u][v],pre[v]=u;
}
if(dis[n+1]>=1e18) puts("NO");
else
{
puts("YES");
int l=0;
for(int u=n+1;u;u=pre[u]) l++;
printf("%d %lld\n",l-2,dis[n+1]);
for(int u=n+1;u;u=pre[u])
{
int v=pre[u];
if(g[v][u]>0) printf("%d %d\n",u,v);
}
}
for(int i=1;i<=n;i++) dfn[i]=low[i]=inscc[i]=0,G[i].clear();
for(int i=1;i<=scc_tot;i++) sz[i]=du[i]=0,G2[i].clear();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 6008kb
input:
1 5 0 1 0 6 11 0 0 1 6 12 2 0 0 7 12 0 0 0 0 4 0 0 0 0 0
output:
YES 2 10 2 4 4 5
result:
ok OK!
Test #2:
score: -100
Wrong Answer
time: 29ms
memory: 6308kb
input:
100 5 0 1 0 6 11 0 0 1 6 12 2 0 0 7 12 0 0 0 0 4 0 0 0 0 0 1 0 2 0 0 7 0 2 0 1000000000 0 0 3 0 0 5 6 0 0 0 7 0 3 0 4 6 0 0 0 0 1 0 3 0 4 0 0 0 0 6 3 0 3 0 0 0 10 0 6 3 0 0 3 0 1999999998 1999999999 0 0 1999999998 0 0 0 50 0 105800 801 1800 64800 0 259200 288801 72201 12801 125000 20001 28801 33800 ...
output:
YES 2 10 2 4 4 5 YES 0 0 NO NO YES 0 0 YES 1 4 1 2 YES 1 3 3 2 YES 2 9 2 3 3 1 YES -1 1000000000 4 0 YES 7 602 4 33 11 47 34 39 YES 9 649 27 12 32 45 17 29 YES 7 1209 1 18 14 35 35 4 4 25 25 12 YES 5 844 3 8 1 41 14 21 YES 5 866 17 35 35 44 46 26 YES 8 1066 10 28 36 24 24 2 37 8 YES 5 1122 4 17 43 1...
result:
wrong answer Test 9: Sum of weights of reversed edges is different than declared