QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#69979 | #4437. Link with Running | BowieSHI | WA | 749ms | 22440kb | C++14 | 4.0kb | 2023-01-03 17:39:59 | 2023-01-03 17:40:01 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#define INF 1e18
#define MAXN 300010
using namespace std;
#define int long long
typedef long long ll;
struct edge{
int v,w,c,nxt;
}e[MAXN<<1];
struct Node{
int x;
ll d;
bool operator < (const Node &rhs) const
{
return d>rhs.d;
}
};
int n,m,t,cnt;
int head[MAXN],deg[MAXN];
ll dis[MAXN],C[MAXN];
priority_queue<Node>Q;
bool used[MAXN];
void add (int u,int v,int w,int c)
{
e[cnt].v=v;
e[cnt].w=w;
e[cnt].c=c;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
vector<int>V;
void dfs (int u,bool flag)
{
used[u]=1;
for (int i=head[u];i!=-1;i=e[i].nxt)
if (e[i].w==0)
{
// if (t==6)
// if (e[i].v==1)
// {
// printf ("shui: %d ",i);
// }
if (!(flag&(e[i].c==0))) deg[e[i].v]++;
if (used[e[i].v]) return;
dfs (e[i].v,flag&(e[i].c==0));
}
}
bool DFS (int u)
{
used[u]=1;
bool flag=0;
for (int i=head[u];i!=-1;i=e[i].nxt)
if (e[i].w==0)
{
if (e[i].v==1) return 1;
if (used[e[i].v]) return 0;
if (DFS (e[i].v)) return 1;
}
return 0;
}
queue<int>q;
void dij ()
{
dis[1]=0,C[1]=0;
Q.push ((Node){1,dis[1]});
while (1)
{
ll dd=-1;
while (!Q.empty ())
{
int u=Q.top().x;
if (used[u]) Q.pop ();
else
{
dd=dis[u];
break;
}
}
if (dd==-1||Q.empty ()) break;
V.clear ();
while (!Q.empty())
{
int u=Q.top().x;
if (dis[u]!=dd) break;
Q.pop ();
if (used[u]) continue;
V.push_back (u);
used[u]=1;
}
// if (t==6)
// for (int i=1;i<=n;i++)
// if (used[i])
// cout<<i<<"* "<<endl;
for (int i=0;i<V.size ();i++)
dfs (V[i],1);
for (int i=0;i<V.size ();i++)
if (deg[V[i]]==0) q.push (V[i]);
// if (t==6) cout<<"deg: "<<deg[1]<<endl;
while (!q.empty ())
{
int u=q.front();
q.pop ();
for (int i=head[u];i!=-1;i=e[i].nxt)
if (e[i].w==0)
{
deg[e[i].v]--;
if (dis[e[i].v]>dis[u]+e[i].w||(dis[e[i].v]==dis[u]+e[i].w&&C[e[i].v]<C[u]+e[i].c))
{
dis[e[i].v]=dis[u]+e[i].w;
C[e[i].v]=C[u]+e[i].c;
}
if (deg[e[i].v]==0) q.push (e[i].v);
}
else
{
if (dis[e[i].v]>dis[u]+e[i].w||(dis[e[i].v]==dis[u]+e[i].w&&C[e[i].v]<C[u]+e[i].c))
{
dis[e[i].v]=dis[u]+e[i].w;
C[e[i].v]=C[u]+e[i].c;
Q.push (((Node){e[i].v,dis[e[i].v]}));
}
}
}
}
}
signed main()
{
scanf ("%lld",&t);
while (t--)
{
cnt=0;
memset (used,0,sizeof (used));
memset (deg,0,sizeof (deg));
scanf ("%lld%lld",&n,&m);
for (int i=1;i<=n;i++) head[i]=-1;
for (int i=1;i<=m;i++)
{
int u,v,w,c;
scanf ("%lld%lld%lld%lld",&u,&v,&w,&c);
add (u,v,w,c);
}
for (int i=1;i<=n;i++) dis[i]=INF,C[i]=-INF;
// if (t==6)
// {
// if (DFS (1)) printf ("FUck");
// memset (used,0,sizeof (used));
// }
dij ();
printf ("%lld %lld\n",dis[n],C[n]);
}
return 0;
}
/*
2
3 3
1 2 1 1
2 3 1 1
1 3 2 0
3 3
1 2 1 1
2 3 1 1
1 3 1 0
*/
详细
Test #1:
score: 0
Wrong Answer
time: 749ms
memory: 22440kb
input:
12 100000 200000 1 2 838279516 902819511 1 3 293478832 513256010 2 4 682688353 204481674 2 5 360092507 651108247 5 6 519851939 323803002 6 7 675439277 205804465 7 8 419167205 386168059 6 9 140767493 382483305 9 10 558115401 613738466 9 11 902235661 744659643 9 12 851394758 1720015 12 13 635355827 46...
output:
5927443549 11285847934 2529348 325344428756 2522027 438209666288 250100947 25049026205784 249512452 24966236662852 1000000000000000000 -1000000000000000000 1000000000000000000 -1000000000000000000 0 1000000000 0 1 1000000000000000000 -1000000000000000000 0 1 0 1
result:
wrong answer 6th lines differ - expected: '0 9535132634', found: '1000000000000000000 -1000000000000000000'