我感觉对Bellman_ford理解得太浅了,很想知道逐边松弛和按点来松弛有什么区别,感觉都是每条边松弛|V|-1遍,然而后者就会wa。
参考了好几篇ac的代码,改了方法之后才成功的,而且貌似时间用的好多。
我总算是有点理解为什么普遍地用数组了,就算开得很大,也要比dynamic的各种结构要快很多并且占的容量少。
我最后的代码和网上的另一篇很像(其实是参考着写的),我觉得他的注释十分易懂,所以贴上他的博客链接:
http://blog.csdn.net/freezhanacmore/article/details/9712799
一下贴我的代码:
#include <iostream>
#include <vector>
using namespace std;
struct edge{
int u,v;
int d;
edge(int U, int V, int D){
u=U;
v=V;
d=D;
}
};
int INF = 10000;
int n;
vector<edge> edges;
int d[510];
bool bellman_ford(){
for(int i=0;i<n;i++) d[i] = INF;
d[0]=0;
for(int i=0;i<n-1;i++){
bool flag = true;
for(int j=0;j<edges.size();j++){
int u = edges[j].u;
int v = edges[j].v;
int t = edges[j].d;
if(d[v]>d[u]+t){
d[v] = d[u] + t;
flag = false;
}
}
if(flag) return false;
}
for(int j=0;j<edges.size();j++){
if(d[edges[j].v] > d[edges[j].u] + edges[j].d)
return true;
}
return false;
}
int main(int argc, const char * argv[]) {
// insert code here...
int Case_no;
int num_path,num_hole;
cin>>Case_no;
while(Case_no--){
cin>>n>>num_path>>num_hole;
if(!edges.empty())
edges.clear();
int u,v,d;
for(int i=0;i<num_path;i++){
cin>>u>>v>>d;
edge e1(u,v,d);
edges.push_back(e1);
edge e2(v,u,d);
edges.push_back(e2);
}
for(int i=0;i<num_hole;i++){
cin>>u>>v>>d;
edge e(u,v,-d);
edges.push_back(e);
}
if(bellman_ford()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}