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

来源:互联网 发布:怎么安装oracle数据库 编辑:程序博客网 时间:2024/06/02 13:00

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");    }}
0 0
原创粉丝点击