求DAG最长路 板子

来源:互联网 发布:在生产实践中用于数据 编辑:程序博客网 时间:2024/05/22 13:15
#include<iostream>  #include<cstdio>  #include<algorithm>  #include<cstring>  #include<vector>  #include<queue>  using namespace std;  const int INF=0x7fffffff/2;  const int SIZEN=10010;  int N,M;  vector<pair<int,int> > c[SIZEN];  void SPFA(vector<pair<int,int> > c[SIZEN],int N,int S,int f[SIZEN]){//图中顶点0~N-1,邻接表为c,以S出发,结果存于f      queue<int> Q;      bool inq[SIZEN]={0};      for(int i=0;i<=N+1;i++) f[i]=-INF;      f[S]=0,inq[S]=true,Q.push(S);      while(!Q.empty()){          int x=Q.front();Q.pop();inq[x]=false;          for(int i=0;i<c[x].size();i++){              int u=c[x][i].first;              if(f[x]+c[x][i].second>f[u]){                  f[u]=f[x]+c[x][i].second;                  if(!inq[u]){                      inq[u]=true;                      Q.push(u);                  }              }          }      }  }  int f[SIZEN];  void work(void){      SPFA(c,N,0,f);      printf("%d\n",f[N+1]);  }  void read(void){      scanf("%d%d",&N,&M);      int a,b,w;      for(int i=0;i<=N+1;i++) c[i].clear();      for(int i=1;i<=M;i++){          scanf("%d%d%d",&a,&b,&w);          c[a].push_back(make_pair(b,w));      }      for(int i=1;i<=N;i++){          c[0].push_back(make_pair(i,0));          c[i].push_back(make_pair(N+1,0));      }  }  int main(){      int T;scanf("%d",&T);      while(T--){          read();          work();      }      return 0;  }