您的位置:首页 > 其它

POJ3259 Wormholes 找负环

2016-11-15 15:24 197 查看
题意:问能否从一个点出发回到这个点时花费变少,求负环, 有普通路(正权,双向) 和 虫洞路(负权,单向)

给定F(1<=F<=5)组数据,对应与一个farm,每组数据对应一个结果。

对于其中一组数据,给定 N , M , W ,N为点数,M为无向边数(普通路径,通过之后时间前进),W为有向边数(虫洞,通过虫洞之后时间倒退),求每组数据是否存在一条回路能使时间倒退。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;

#define MAX_V (2525)
#define MAX_E (6262)
int V, E, EE, tot = 0;
int first[MAX_V], nxt[MAX_E<<1], dis[MAX_V];
bool used[MAX_V];
struct edge{
int from, to, cost;
}es[MAX_E<<1];

void build(int ff, int tt, int dd)
{
es[++tot] = (edge){ff,tt,dd};
nxt[tot] = first[ff];
first[ff] = tot;
}

#define INF (1e9)
queue <int> q;
int tim[MAX_V];
string spfa(int s)
{
fill(dis+1,dis+V+1,INF);
dis[s] = 0;
q.push(s);
used[s] = 1;
while(q.size())
{
int x = q.front();
q.pop();
used[x] = 0;
if(++tim[x] > V) return "YES";
for(int i = first[x]; i != -1; i = nxt[i])
{
int v = es[i].to;
if(dis[v] > dis[x] + es[i].cost)
{
dis[v] = dis[x] + es[i].cost;
if(!used[v])
{
q.push(v);
used[v] = 1;
}
}
}
}
return "NO";
}

int main()
{
int T;
cin >> T;
while(T --)
{
tot = 0;
memset(first,-1,sizeof(first));
memset(nxt,0,sizeof(nxt));
memset(used,0,sizeof(used));
memset(es,0,sizeof(es));
memset(tim,0,sizeof(tim));
while(q.size()) q.pop();

scanf("%d%d%d", &V, &E, &EE);
for(int i = 1; i <= E; ++ i)
{
int f, t, d;
scanf("%d%d%d", &f, &t, &d);
build(f,t,d); build(t,f,d);
}
for(int i = 1; i <= EE; ++ i)
{
int f, t, d;
scanf("%d%d%d", &f, &t, &d);
build(f,t,-d);
}
cout << spfa(1) << '\n';
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 负环