生活随笔
收集整理的這篇文章主要介紹了
2018.09.15 vijos1053Easy sssp(最短路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
貌似可以最短路時同時判定負環啊。
但我不想這樣做。
于是寫了一個dfs版的判環,bfs版的求最短路。
代碼:
#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<queue>
#define N 1005
#define M 1000005
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
int ans=
0,w=
1;
char ch=getchar();
while(!
isdigit(ch)){
if(ch==
'-')w=-
1;ch=getchar();}
while(
isdigit(ch))ans=(ans<<
3)+(ans<<
1)+(ch^
48),ch=getchar();
return ans*w;
}
int n,m,first[N],cnt=
0,d[N];
bool in[N];
struct edge{
int v,next,w;}e[M<<
1];
inline void add(
int u,
int v,
int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
inline bool spfa(
int p){in[p]=
true;
for(
int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(d[v]>d[p]+e[i].w){d[v]=d[p]+e[i].w;
if(in[v]||spfa(v))
return in[p]=
false,
true;}}
return in[p]=
false;
}
inline bool check(){
for(
int i=
1;i<=n;++i)
if(spfa(i))
return true;
return false;
}
inline void Spfa(
int s){
queue<int>q;
for(
int i=
1;i<=n;++i)d[i]=inf,in[i]=
false;q.push(s),d[s]=
0,in[s]=
true;
while(!q.empty()){
int x=q.front();q.pop();in[x]=
false;
for(
int i=first[x];i;i=e[i].next){
int v=e[i].v;
if(d[v]>d[x]+e[i].w){d[v]=d[x]+e[i].w;
if(!in[v])in[v]=
true,q.push(v);}}}
}
int main(){
int s;n=read(),m=read(),s=read();
for(
int i=
1;i<=m;++i){
int u=read(),v=read(),w=read();add(u,v,w);}
if(check()){
printf(
"-1");
return 0;}Spfa(s);
for(
int i=
1;i<=n;++i){
if(d[i]==inf)
puts(
"NoPath");
else printf(
"%d\n",d[i]);}
return 0;
}
轉載于:https://www.cnblogs.com/ldxcaicai/p/9738266.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的2018.09.15 vijos1053Easy sssp(最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。