zoukankan      html  css  js  c++  java
  • poj3259 SPFA

      学习SPFA,正好是裸的SPFA,然后我就学习了一下。

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <math.h>
      4 #include <queue>
      5 #include <string.h>
      6 #define  maxn 600
      7 #define  INF 0x7fffffff
      8 using namespace std;
      9 struct node {
     10     int to;
     11     int weight;
     12     node* next;
     13 };
     14 node* LIST[maxn];
     15 queue<int>Q;
     16 int dist[maxn],inq[maxn],count1[maxn],path[maxn];
     17 bool SPFA(int begin,int n);
     18 int main()
     19 {
     20     int n,m,w;
     21     int i,j;
     22     int t;
     23     int t1,t2,t3;
     24     node* temp;
     25     while(~scanf("%d",&t)){
     26         while(t--){
     27            scanf("%d%d%d",&n,&m,&w);
     28            memset(LIST,0,sizeof(LIST));
     29            while(m--){
     30                scanf("%d%d%d",&t1,&t2,&t3);
     31                temp=new node;
     32                temp->to=t2;  temp->weight=t3; temp->next=NULL;
     33                if(LIST[t1]==NULL)
     34                    LIST[t1]=temp;
     35                else
     36                    temp->next=LIST[t1],LIST[t1]=temp;
     37                temp=new node;
     38                temp->to=t1;  temp->weight=t3; temp->next=NULL;
     39                if(LIST[t2]==NULL)
     40                    LIST[t2]=temp;
     41                else
     42                    temp->next=LIST[t2],LIST[t2]=temp;
     43            } 
     44            while(w--){
     45                scanf("%d%d%d",&t1,&t2,&t3);
     46                temp=new node;
     47                temp->to=t2; temp->weight=-t3; temp->next=NULL;
     48                if(LIST[t1]==NULL)
     49                    LIST[t1]=temp;
     50                else
     51                    temp->next=LIST[t1],LIST[t1]=temp;
     52            }
     53 
     54            if(SPFA(1,n))
     55                printf("YES\n");
     56            else
     57                printf("NO\n");
     58            for(i=1;i<=n;++i){
     59                temp=LIST[i];
     60                while(temp!=NULL){
     61                    LIST[i]=temp->next;  delete temp; temp=LIST[i];
     62                }
     63            }
     64         }
     65     }
     66     return 0;
     67 }
     68 bool SPFA(int begin,int n)
     69 {
     70     memset(inq,0,sizeof(inq));
     71     memset(count1,0,sizeof(count1));
     72     while(!Q.empty())
     73         Q.pop();
     74     int i,u;
     75     for(i=1;i<=n;++i)
     76         dist[i]=INF,path[i]=begin,inq[i]=0;
     77     node* temp;
     78     dist[begin]=0,inq[begin]++;
     79     Q.push(begin),count1[begin]++;
     80     while(!Q.empty()){
     81         u=Q.front();
     82         Q.pop();
     83         inq[u]--;
     84         if(count1[u]>n)
     85            return true;
     86         temp=LIST[u];
     87         while(temp!=NULL){
     88             int v=temp->to;
     89             if(dist[v]>dist[u]+temp->weight){
     90                 dist[v]=dist[u]+temp->weight,path[v]=u;
     91                 if(!inq[v]){
     92                       Q.push(v);  count1[v]++;  inq[v]++;
     93                 }
     94             }
     95             temp=temp->next;
     96         }
     97     }
     98     return false;
     99 }
    100 
    101 
    102 
    103 
    104     
    105     
    106         
  • 相关阅读:
    设计模式-中介者模式
    设计模式-中介者模式
    设计模式-职责链模式
    设计模式-职责链模式
    设计模式-命令模式
    设计模式-命令模式
    设计模式-桥接模式
    模乘逆元与孙子定理
    网贷野蛮生长加速 超百亿平台频频涌现
    获乐视千万投资 电桩“傍上大款”
  • 原文地址:https://www.cnblogs.com/symons1992/p/3067407.html
Copyright © 2011-2022 走看看