您的位置:首页 > 其它

poj 3259 Wormholes【spfa判负环】

2017-04-03 16:43 483 查看
点击打开链接

题意:  给你个地图,很多条双向的路走着费时间, 然还有单向的虫洞返回时间,

问你能不能到达某个点时候时间比之前到达这个点时候之前,从而遇见之前的自己,达到时光旅行。

题解:

    跑spfa 判断 负环就行。。 我现场竟然拿着floyd 狂怼几发, 都te 不过最后硬是floyd 怼过了。

floyd:

#include<iostream>
#include<string>
#include<stdio.h>
#include<string.h>
#include<map>
#include<set>
#include<queue>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=555;
const int maxm=1e5+100;
const int inf = 5000001;

int dis[maxn][maxn];
int n,m,w,T,a,b,val,ans;
int floyd(){
for(int k=1;k<=n;++k){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(dis[i][k]+dis[k][j]<dis[i][j]){
dis[i][j]=dis[i][k]+dis[k][j];
if(dis[i][i]<0) return 1;
}
}
}
}
return 0;
}
int main(){

scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&w);
for(int i=1;i<=n;++i){
dis[i][i]=0;
for(int j=i+1;j<=n;++j) dis[i][j]=dis[j][i]=inf;
}
for(int i=1;i<=m;++i){
scanf("%d %d %d",&a,&b,&val);
if(val<dis[a][b]) dis[a][b]=dis[b][a]=val;
}

for(int i=1;i<=w;++i){
scanf("%d %d %d",&a,&b,&val);
dis[a][b]=-val;
}
int ans=floyd();
if(ans)printf("YES\n");
else printf("NO\n");
}
return 0;
}
spfa:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int inf=0xffffff;
const int maxn=505;
struct node{
int to,w,nxt;
}edge[maxn*maxn];
int n,m,w,T,cnt;
int head[maxn];
int dis[maxn];
int v[maxn];
int out[maxn];
void addedge(int x,int y,int val){
edge[++cnt].to=y;
edge[cnt].w=val;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
int spfa(int s){
for(int i=0;i<=n;++i) dis[i]=inf;
memset(v,0,sizeof(v));
memset(out,0,sizeof(out));
queue<int>que;
que.push(s);
dis[s]=0;

while(!que.empty()){
int u=que.front();
que.pop();
out[u]++;v[u]=0;
if(out[u]>n) return 1;
for(int i=head[u];i!=-1;i=edge[i].nxt){
int vv=edge[i].to;
if(dis[vv]>dis[u]+edge[i].w){
dis[vv]=dis[u]+edge[i].w;
if(!v[vv]){
v[vv]=1;
que.push(vv);
}
}
}
}
return 0;
}
int main(){
int a,b,c;
scanf("%d",&T);
while(T--){
cnt=0;
memset(head,-1,sizeof(head));
scanf("%d %d %d",&n,&m,&w);
while(m--){
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
while(w--){
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,-c);
}
if(spfa(n))printf("YES\n");
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: