QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#611219 | #7992. 【模板】线段树 | DengDuck | RE | 0ms | 0kb | C++20 | 1.7kb | 2024-10-04 19:57:02 | 2024-10-04 19:57:03 |
answer
#include<bits/stdc++.h>
#define LL long long
#define pb push_back
#define Edge pair<int,LL>
#define pLL pair<LL,int>
#define To first
#define W second
using namespace std;
const int N=3e5+5;
const LL Inf=1e18;
set<Edge>E[N],R[N];
vector<Edge>G[N];
LL D[N],Ans=Inf;
int n,m,Vis[N];
inline void Add(int x,int y,LL w){E[x].insert({y,w}),R[y].insert({x,w});}
inline void Del(int x,int y)
{
E[x].erase(E[x].lower_bound({y,0}));
R[y].erase(R[y].lower_bound({x,0}));
}
inline void Dij(int x)
{
priority_queue<pLL,vector<pLL>,greater<pLL> >Q;
Q.push({D[x]=0,x});
vector<int>V;V.pb(x);
while(!Q.empty())
{
int x=Q.top().W;Q.pop();
if(Vis[x])continue;Vis[x]=1;
for(Edge i:E[x])
{
if(D[x]+i.W<D[i.To]&&D[x]+i.W<Ans)
Q.push({D[i.To]=D[x]+i.W,i.To}),V.pb(i.To);
}
}
for(Edge i:R[x])Ans=min(Ans,D[i.To]+i.W);
for(int i:V)D[i]=Inf,Vis[i]=0;
}
queue<int>Q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,x,y,w;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
if(x==y)Ans=min(Ans,w*1ll);
else Add(x,y,w);
}
for(int i=1;i<=n;i++)Q.push(i);
while(!Q.empty())
{
int x=Q.front();Q.pop();
if(E[x].empty())
{
set<Edge>V=R[x];
for(Edge i:V)Q.push(i.To),Del(i.To,x);
}
if(R[x].empty())
{
set<Edge>V=E[x];
for(Edge i:V)Q.push(i.To),Del(x,i.To);
}
if(E[x].size()==1&&R[x].size()==1)
{
Edge A=*R[x].begin(),B=*E[x].begin();
Del(A.To,x),Del(x,B.To);
if(A.To==B.To)
{
Ans=min(Ans,A.W+B.W);
Q.push(A.To);
continue;
}
Add(A.To,B.To,A.W+B.W);
Q.push(A.To);
}
}
for(int i=1;i<=n;i++)
{
if(!E[i].empty())D[i]=Inf;
}
for(int i=1;i<=n;i++)
{
if(!E[i].empty())Dij(i);
}
if(Ans==Inf)puts("-1");
else printf("%lld\n",Ans);
}
详细
Test #1:
score: 0
Runtime Error
input:
10 10 969575 741825 24903 1047319 450475 256145 1045323 479255 810659 768323 1 5 6 3034 2 1 10 2 1 9 2 1 4 1 3 6 126904 2 5 5 2 9 9 1 7 7 853094 1 4 9 1025178 2 5 8