3259Wormholes

Bellman-Ford算法--从边的角度出发

SPFA算法--从顶点出发,用队列优化,用一个count记录这个顶点压入队列多少次来决定他是不是存在负权

Bellman-ford算法浪费了许多时间做无必要的松弛SPFA算法用队列进行了优化,效果十分显著,高效难以想象,Dijkstra算法无法判断负权回路,所以遇到负权还是要用Bellman-Ford,或者是SPFA

 

2,电脑真的是可以拿来修身养性的啊,它就是一小孩,坑爹啊,很直白,就是错了也很直白,所以打代码时得有心理准备,不会一次性通过的,如果通过了,一般都是水题来的

3.模拟题目,也许这种思考方式不行,我们可以换种思考方式,但要时刻提醒自己,感觉这样不对劲,都要思考为什么不对。

4.输出没有达到自己想要的结果,那就是我们错了,电脑是不会出错的

5.这道题目还没有通过

#include "iostream"
#include "string.h"
#include "queue"
using namespace std;
struct {
  int s,e,t;
}list[1000];
int main(){
  int Case,n,m,w,i,j;
  int time[1000],set[1000],set1[1000];
  queue<int> Q;
  memset(time,0,sizeof(time));
  memset(set,0,sizeof(set));
  cin>>Case;
  while(Case--){
    cin>>n>>m>>w;

    for(i=0;i<m;i++){
      int pos=(i<<1);
      cin>>list[pos].s>>list[pos].e>>list[pos].t;
      list[pos+1].s=list[pos].e;
      list[pos+1].e=list[pos].s;
      list[pos+1].t=list[pos+1].t;
    }
    for(i=2*m;i<2*m+w;i++){
      cin>>list[i].s>>list[i].e>>list[i].t;
      list[i].t=0-list[i].t;
    }

   for(i=1;i<=n;i++){
     memset(time,0,sizeof(time));
     memset(set1,0,sizeof(time));
     time[i]=0;
     set[i]=1;
     Q.push(i);
     while(!Q.empty()){
       int flag=Q.front();
       Q.pop();
       set[flag]=0;
       for(j=0;j<2*m+w;j++){
         if(time[list[j].e]>time[list[j].s]+list[j].t&&list[j].s==flag){
           time[list[j].e]=time[list[j].s]+list[j].t;
           if(!set[list[j].e]){
              Q.push(list[j].e);
              set[list[j].e]=1;
              set1[list[j].e]=1;
            }
         }
         for(int k=0;k<2*m+w;k++)
          if(list[k].e==i&&set1[list[k].s]){
           if(time[list[k].s]+list[k].t<0){cout<<"YES"<<endl;goto l1;}
        }
       }
     }
   }
   cout<<"NO"<<endl;
 l1:;
}
}
原文地址:https://www.cnblogs.com/dowson/p/3250843.html