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;
}
题意: 给你个地图,很多条双向的路走着费时间, 然还有单向的虫洞返回时间,
问你能不能到达某个点时候时间比之前到达这个点时候之前,从而遇见之前的自己,达到时光旅行。
题解:
跑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;
}
相关文章推荐
- 最短路 SPFA 判断负环 静态邻接表(链式前向星) HDU 2544 最短路 POJ 3259 Wormholes
- poj 3259 Wormholes【spfa判断负环】
- poj 3259 Wormholes 【SPFA&&推断负环】
- POJ 3259 Wormholes (判断负环,SPFA或Bellman-Ford都可)
- POJ 3259 Wormholes(判断负环&(Bellman-Ford|SPFA))
- 【POJ 3259】Wormholes (SPFA 判断负环)
- (POJ 3259)Wormholes 判断负环 bellman_ford 或者 spfa
- poj 3259 Wormholes 【SPFA&&推断负环】
- POJ 3259 Wormholes(SPFA判负环)
- (简单) POJ 3259 Wormholes,SPFA判断负环。
- POJ 3259 Wormholes (最短路 SPFA 判断负环)
- Poj 3259 Wormholes (SPFA判负环)
- poj 3259--Wormholes 【spfa判负环】
- 【POJ 3259】Wormholes 【spfa判负环】
- POJ 3259 Wormholes(SPFA 判负环)
- POJ 3259 Wormholes(spfa判负环)
- POJ - 3259 Wormholes(判断负环, Bellman Ford,SPFA)
- Poj 3259 Wormholes(spfa判负环)
- poj 3259 Wormholes (spfa判负环)
- POJ 3259 Wormholes 【SPFA 判断负环】