思路:
这题完全按照挑战上面的方法来做,开始我不是很能理解这种方法的含义。请自行阅读挑战。
一开始我超时了,不知道是什么原因,我写了一个队列优化的bellman ford ,还用了vector的邻接表,不知道为什么会超时。。。其实回头看一下,bellman ford根本就不需要邻接表。。。。
回头再看一下那个队列优化吧,感觉是自己写崩了。
后来直接重写,最普通的那种bellamn ford 结果过了。。。。
随便说一下,感觉挑战上面的写法有问题,奶牛的编号是从一开始的,可是挑战上面奶牛的编号貌似是从0开始的
#include<iostream> #include<cstdio> using namespace std; const int inf=2100000000; int u[30000],v[30000],w[30000]; int dis[10086]; int main() { int n,ml,md; scanf("%d%d%d",&n,&ml,&md); int t=0; for(int i=2;i<=n;i++){ u[t]=i;v[t++]=i-1; } int x,y,wa; for(int i=1;i<=ml;i++){ scanf("%d%d%d",&u[t],&v[t],&w[t]); t++; } for(int i=1;i<=md;i++){ scanf("%d%d%d",&v[t],&u[t],&w[t]); w[t]*=-1;t++; } fill(dis,dis+n+5,inf); int flag=0; dis[1]=0; for(int k=0;k<n;k++){ flag=0; for(int i=0;i<t;i++){ if(dis[v[i]]>dis[u[i]]+w[i]){ dis[v[i]]=dis[u[i]]+w[i]; flag=1; } } if(!flag){break;} } if(dis[1]<0){printf("-1 ");} else if(dis[n]==inf){printf("-2 ");} else printf("%d ",dis[n]); }