spfa poj 3259

来源:互联网 发布:中科院人工智能芯片 编辑:程序博客网 时间:2024/05/17 22:38
#include "iostream"#include "vector"#include "queue"using namespace std;struct edge{int start;int end;int time;//weight};const int maxint = 1000000;std::vector<std::vector<edge> > E;bool relax(std::vector<int> &d,int start,int end,int weight){if(d[end] > d[start] + weight){d[end] = d[start] + weight;return true;}return false;}bool spfa(int vertexnum){queue<int> q;std::vector<bool> visited(vertexnum,false);std::vector<int> count(vertexnum,0);std::vector<int> d(vertexnum,maxint);int source = 1;for (int i = 1; i <= vertexnum; ++i){d[i] =(i==source)?0:maxint;}q.push(source);visited[source] = true;count[source]++;while(!q.empty()){int front = q.front();q.pop();for (int i = 0; i < E[front].size(); ++i){edge tmp = E[front][i];if(relax(d,tmp.start,tmp.end,tmp.time)){if(!visited[tmp.end]){q.push(tmp.end);visited[tmp.end] = true;count[tmp.end]++;if(count[tmp.end] > vertexnum){while(!q.empty()){q.pop();}return false;}}}}visited[front] = false;}return true;}int main(int argc, char const *argv[]){int farm,vertexnum;int field,path,hole;//field即是vertexnumint start,end,time;int num;cin>>farm;while(farm--){cin>>field>>path>>hole;E.resize(2*path+hole+1);num = 0;for (int i = 0; i < path; ++i){cin>>start>>end>>time;edge temp;temp.start = start;temp.end = end;temp.time = time;E[start].push_back(temp);temp.start = end;temp.end = start;temp.time = time;E[end].push_back(temp);}for (int i = 0; i < hole; ++i){cin>>start>>end>>time;edge temp;temp.start = start;temp.end = end;temp.time = -time;E[start].push_back(temp);}vertexnum = field;if(!spfa(vertexnum)){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}E.clear();//没有这个会出错}return 0;}

原创粉丝点击