您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 -F

2016-12-14 11:29 351 查看
http://poj.org/problem?id=3259

题意:

有的边是负数,问从一点出发能不能用小于0的时间回去

tip:

路是双向,虫洞单向,其他模板。。。要气死了。。。。双向着了1h错误

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int>q;
const int maxm = 2600;
const int maxn = 600;
bool inq[maxn*2];
int n,m,w;
int head[maxn*2],tot,dis[maxn*2],num[maxn*2];
struct node{
int v,t,next;
}edges[maxm*50];
void add(int u,int v,int t){
edges[tot].v = v;edges[tot].t = t;edges[tot].next = head[u];head[u] = tot++;
}

void init(){
tot = 0;
while(!q.empty())  q.pop();
memset(head,-1,sizeof(head));
memset(inq,false,sizeof(inq));
memset(num,0,sizeof(num));

scanf("%d%d%d",&n,&m,&w);
for(int i =  1 ; i <= n ; i++)
dis[i] = 1<<30;
for(int i =  0; i < m ; i++){
int u,v,t;
scanf("%d%d%d",&u,&v,&t);
add(u,v,t);
add(v,u,t);
}
for(int i = 0 ; i < w ; i++){
int u,v,t;
scanf("%d%d%d",&u,&v,&t);
add(u,v,-t);
}

}

bool spfa(){
q.push(1);
dis[1] =0;
inq[1] = true;
num[1]++;
while(!q.empty()){
int tmp = q.front();
q.pop();

for(int k = head[tmp];k!=-1;k = edges[k].next){
if(dis[edges[k].v] > dis[tmp]+edges[k].t){
dis[edges[k].v] = dis[tmp]+edges[k].t;
if(dis[1] < 0)      return true;
if(!inq[edges[k].v]){
inq[edges[k].v]=true;
q.push(edges[k].v);
num[edges[k].v]++;
if(num[edges[k].v] > n-1)       return true;
}
}
}
inq[tmp] = false;
}
if(dis[1] < 0 )     return true;
return false;
}

int main(){
int T;
scanf("%d",&T);
while(T--){
init();
if(spfa())      printf("YES\n");
else    printf("NO\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: