差分约束
我也忘了谁说的了,反正我记得有人说过,只要是差分约束问题都可以转换成图
至少目前看来都是这样的
我一开始spfa+queue超时
看别人博客才知道要用spfa+stack,感觉智商又下降了一点
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 30005; int head[maxn]; int nex[150005]; int cnt; int dis[maxn]; bool vis[maxn]; struct node { int v; int w; }; node mp[150005]; int n,m; void adde(int a,int b,int c) { mp[cnt].v = b; mp[cnt].w = c; nex[cnt] = head[a]; head[a] = cnt++; } long long spfa() { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); int stac[maxn]; int top = 0; stac[top++] = 1; dis[1] = 0; vis[1] =true; while(top) { int u = stac[--top]; vis[u] = false; for(int i = head[u]; i != -1; i = nex[i]) { //cout << u << " " << mp[i].v << " " << mp[i].w << endl; if(dis[mp[i].v] > dis[u] + mp[i].w) { dis[mp[i].v] = dis[u] + mp[i].w; //cout<< mp[i].v << " " << dis[mp[i].v] << endl; if(vis[mp[i].v] == false) { stac[top++] = mp[i].v; vis[mp[i].v] = true; } } } } return dis[n]; } int main() { //while(scanf("%d%d",&n,&m) != EOF) //{ memset(mp,0,sizeof(mp)); scanf("%d%d",&n,&m); cnt = 0; memset(head,-1,sizeof(head)); for(int i = 0; i < m; ++i) { int a,b,c; scanf("%d%d%d",&a,&b,&c); adde(a,b,c); } printf("%d\n",spfa()); //} }