题意:
给定一个有向图,每条边都有一个权值,每次你可以选择一个结点和一个整数的,把所有以v为终点的边的权值减去d,
把所有以v为起点的边的权值加上d
最后要让所有边的权的最小值非负且尽量大
代码
#include#include #include #include #include #include using namespace std;const int N = 1e3;const int inf = 0x3f3f3f3f;int dist[N],inq[N],cnt[N];struct node{ int v,w; node(int v,int w):v(v),w(w) {};};vector G[N];void init(int n){ for(int i = 0; i<=n; i++) G[i].clear();}bool spfa(int n){ queue q; q.push(0); memset(inq,0,sizeof(inq)); memset(cnt,0,sizeof(cnt)); memset(dist,inf,sizeof(dist)); dist[0] = 0; inq[0] = 1; cnt[0] = 1; while(!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for(int i = 0; i dist[u] + w) { dist[v] = dist[u] + w; if(!inq[v]) q.push(v),inq[v] = 1; if(++cnt[v]>n) return true; } } } return false;}bool test(int mid,int n){ for(int i = 1; i<=n; i++) for(int j = 0; j