| You are given a directed graph G(V,E) with a set of vertices and edges. Each edge (i,j) that connects some vertex i to vertex j has an integer cost associated with that edge. Define the operation Halum(v, d) to operate on a vertex v using an integer d as follows: subtract d from the cost of all edges that enter v and add d to the cost of every edge that leaves v. As an example of that operation, consider graph G that has three vertices named (1, 2, 3) and two edges. Edge (1, 2) has cost -1, and edge (2,3) has cost 1. The operation Halum(2,-3) operates on edges entering and leaving vertex 2. Thus, edge (1, 2) gets cost -1-(-3)=2 and the edge (2, 3) gets cost 1 + (-3) = -2. Your goal is to apply the Halum function to a graph, potentially repeatedly, until every edge in the graph has at least a certain cost that is greater than zero. You have to maximize this cost. | |
| 2 1 1 2 10 2 1 1 2 -10 3 3 1 2 4 2 3 2 3 1 5 4 5 2 3 4 4 2 5 3 4 2 3 1 0 1 2 -1 白书上的例题:白书上说答案为非负,然后弹了n遍,一看题意是大于0。坑爹 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 500+10;
const int maxm = 5700+10;
const int inf = 1e9;
struct edge{
int v,w,nxt;
}e[maxm];
int nume,ne,nv;
int head[maxn];
queue<int> que;
bool inQue[maxn];
int cnt[maxn];
int dist[maxn];
void init(){
memset(head,0,sizeof head);
nume = 1;
}
void addedge(int u,int v,int w){
e[++nume].nxt = head[u];
e[nume].v = v;
e[nume].w = w;
head[u] = nume;
}
bool SPFA(int dis){
memset(inQue,0,sizeof inQue);
memset(cnt,0,sizeof cnt);
while(!que.empty()) que.pop();
int src = 0;
inQue[src] = true;
que.push(src);
for(int i = 1; i <= nv; i++) dist[i] = inf;
dist[src] = 0;
while(!que.empty()){
int u = que.front();
que.pop();
inQue[u] = false;
for(int i = head[u]; i ; i = e[i].nxt){
int v = e[i].v,w = e[i].w - dis;
if(dist[u]+w < dist[v]){
dist[v] = dist[u]+w;
if(!inQue[v]){
if(++cnt[v] >= nv+1)
return false;
inQue[v] = true;
que.push(v);
}
}
}
}
return true;
}
int binary_ser(){
int L = 2,R = 10001;
int ans = 0;
while(L <= R){
int mid = (L+R)>>1;
if(SPFA(mid)){
L = mid+1;
}else{
R = mid-1;
}
}
return R;
}
int main(){
while(~scanf("%d%d",&nv,&ne)){
int a,b,c;
init();
for(int i = 0; i < ne; i++){
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
for(int i = 1; i <= nv; i++){
addedge(0,i,0);
}
if(SPFA(10001)){
printf("Infinite\n");
}
else if(!SPFA(1)){
printf("No Solution\n");
}else{
printf("%d\n",binary_ser());
}
}
return 0;
}
| Infinite Infinite 3 1 | |