負のリングとは何ですか?
名前が示すように、それはリングのすべてに右側とマイナス側であります
負のリングが起こりますか?
私たちは、通常の状況下では、グラフ上の最短が決定される、ということを知っています。グラフは、負のリングを持っているしかし、一度、\(S \)にする(T \)\このリングをカバーするために長い距離を移動します最短である(限り、彼らが到着すると)、およびトラブルが何度も繰り返しました。リングリングとマイナスになる権利のマイナス側に、そしてそれは、それは再度行くと多くの時間がエントリーの時点で宿泊している行くことを言うことです。微小で多数回、つまり後あれば一旦負リングを通る最短経路は、これは、ビット当たりのコストを削減する最短パスが存在しません。もちろん、各ポイントの後に、限られた回数以上存在していないです\(1 \)回。
このような大規模なリングのマイナス影響するので、それは私たちの次の質問につながります。
どのように負のジャッジメントリング?
私は、我々はすべての最短経路計算方法のうちの少なくとも2つを学んだと考えているが、いくつかはまた、意志\(ダイクストラ\)と\(SPFA \)これら2つのアルゴリズムの(SPFAを学ぶために行ってくださいいない場合は、このブログを見に来ます)。各1を持つ2つの花、。ここでは、の話を\(SPFA \) 。我々はすべて知っているように、\(SPFA \)の判定方法は、出発点への最短経路の各ポイントを締め続けることで、それぞれが必ずしも最もタイトを受けませんが、限り解決策として、最終的には最もコンパクトを収穫します(これはそれはまた、それがとてもうまくカードで、少しずつ、あなたは)遅くなることができない理由です。我々は先に述べたように、負のリングがある場合、最短パスは無限小縮小していきます。そこでここでは、この機能でそれを適用することができます。で\(SPFA \)、各点は、最短その他れる\(N-1 \)を締め付けた場合、締めする各時間点\(N \)を回、それは明らかに無理です。その後、我々は超えて、各点の数を締め付けている、いかなる点が存在しない記録\(N \)回、我々は負環の存在を決定することができ、そして場合\(SPFA \)が正常に轢か、負ループによって証明されるようには存在しません。
驚くべきことに、私は単調なキューの最適化を使用\(SPFA \)を、この質問がなかったので、私たちはまだ通常の使用\(SPFA \)を(結局、質問の人々はいつもあなたが判断することはできません任せることはできない)ことを決定します。
ここでは、コードです
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<queue>
#define ll long long
#define gc getchar
#define maxn 2050
#define maxm 3050
using namespace std;
inline ll read(){
ll a=0;;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int t,n,m;
struct ahaha{
int w,to,next;
}e[maxm<<1];int tot,head[maxn];
inline void add(int u,int v,int w){
e[tot]={w,v,head[u]};head[u]=tot++;
}
queue<int>q;
int d[maxn],s[maxn];
inline bool spfa(){d[1]=0;
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(d[v]<=d[u]+e[i].w)continue;
if(s[v]+1==n)return 1;++s[v];d[v]=d[u]+e[i].w;
q.push(v);
}
}return 0;
}
inline void clear(){tot=0;
memset(head,-1,sizeof head);
memset(d,63,sizeof d);
memset(s,0,sizeof s);
}
int main(){
t=read();
while(t--){clear();
n=read();m=read();
for(int i=1;i<=m;++i){
int u=read(),v=read(),w=read();
add(u,v,w);if(w>=0)add(v,u,w);
}
puts(spfa()?"YE5":"N0");
while(!q.empty())q.pop();
}
return 0;
}
長い時間の例を開催しますOIとの接触無し、と少しさび、(実際には、検索する時間がありません)。
私はどのようにについての私のブログの助けかどうか分からないのですか?あなたは少し助けている場合、それは勧告を指している可能性があります。