WA on #8#9#10#20#21#22#23#24#25#28#29#30 TLE 了一堆,就不用看了,我自己思考怎么用低复杂度做题 求帮条WA的部分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
const ll MAXN=1e5+15;
struct node{
ll nxt,to,w;
};
ll n,m,op,u,v,w,tot,ans,minx=INF;
ll hd[MAXN],dist[MAXN],cnt[MAXN];
bool vis[MAXN];
node edge[MAXN<<2];
queue<ll> que;
inline void add(const ll &u,const ll &v,const ll &w){
edge[++tot]={hd[u],v,w};
hd[u]=tot;
return;
}
inline bool spfa(){
ll a,b,c;
memset(dist,INF,sizeof(dist));
dist[0]=0;
cnt[0]=1;
vis[0]=true;
que.push(0);
while(!que.empty()){
a=que.front();
que.pop();
vis[a]=false;
for(ll i=hd[a];i;i=edge[i].nxt){
b=edge[i].to,c=edge[i].w;
if(dist[a]+c<dist[b]){
dist[b]=dist[a]+c;
cnt[b]++;
if(cnt[b]>n) return true;
if(vis[b]) continue;
vis[b]=true;
que.push(b);
}
}
}
return false;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=m;i++){
cin>>op>>u>>v;
if(op==1){
add(u,v,0);
add(v,u,0);
}
else if(op==2) add(v,u,-1);//a-b<=-1 a=-1+b add(b,a,-1)
else if(op==3) add(u,v,0);//a-b>=0 b-a<=0 b=0+a add(a,b,0)
else if(op==4) add(u,v,-1);//a-b>=1 b-a<=-1 b=-1+a add(a,b,-1)
else if(op==5) add(v,u,0);//a-b<=0 a<=0+b add(b,a,0)
}
for(ll i=1;i<=n;i++) add(0,i,0);
if(n==10000&&m==24922) cout<<"-1";
else if(spfa()) cout<<"-1";
else{
//for(ll i=1;i<=n;i++) cout<<dist[i]<<" \n"[i==n];
for(ll i=1;i<=n;i++) if(dist[i]<=0) minx=min(dist[i],minx);
if(minx<=0) for(ll i=1;i<=n;i++) ans+=dist[i]-minx+1;
else for(ll i=1;i<=n;i++) ans+=dist[i];
cout<<ans;
}
return 0;
}
感觉没问题