int main() {
    int cas;
    cin >> cas;
    for(int i = 0;i < cas;i++) {
        cin >> n >> m >> c;
        init();
        read();
        printf("Case #%d: ",i+1);
        cout << spfa() << endl;
    }
    return 0;
}
Example #2
0
void work()
{
	for(int i=1;i<=n;++i)
	{
//		printf("%d\n",i);
		memset(canuse,true,sizeof(canuse));
		for(int j=1;j<=n;++j) if(L[j]>L[i]||L[j]<L[i]-m) canuse[j]=false;
//		for(int j=1;j<=n;++j) printf("%d ",canuse[j]);
//		printf("\n");
		ans=min(ans,spfa(0,i));
	}
	printf("%d\n",ans);
}
Example #3
0
void work()
{
	l=0,r=10000.0;
	while(r-l>0.0001)
	{
		mid=0.5*(l+r);
	//	printf("%.4lf %.4lf\n",l,r);
		if(spfa(mid))
			r=mid;
		else l=mid;
	}
	printf("%.3lf\n",l);
}
 pair<long long,long long> getmcmf(int sz,int source,int sink,int times){
     pair<long long,long long> res;
     res.first=0;res.second=0;n=sz;
     if(!times) times=-1;
     while(times){
     	spfa(source,sink);
         if(d[sink][1] == 0) break;
         res.first += d[sink][1];
         res.second += d[sink][0] * d[sink][1];
         track(sink,source,(int)d[sink][1]);
         times--;
     }
     return res;
 }
Example #5
0
int main(){
	int Q;
	scanf("%d %d",&n,&Q);
	for (int i=1;i<n;++i){
		int x,y,w;
		scanf("%d %d %d",&x,&y,&w);
		AddEdge(x,y,w);
	}
	for (;Q;Q--){
		scanf("%d %d",&S,&T);
		printf("%d\n",spfa());
	}
	return 0;
}
Example #6
0
int main(){
	scanf("%d%d%d",&n,&a,&b);
	if (a==b) {puts("0");return 0;}
	for (int i=1;i<=n;++i) {
		scanf("%d",K+i);
		if (i+K[i]<=n)g.AddEdge(i,i+K[i]);
		if (i-K[i]>0)g.AddEdge(i,i-K[i]);
	}
	memset(dist,60,sizeof(dist));
	int max=dist[1];
	spfa();
	if (dist[b]!=max) printf("%d\n",dist[b]);else puts("-1");
	return 0;
}
Example #7
0
void costflow(){
	s=0;t=202;
	while (spfa()){
		ans+=dist[t];
		int flow=0x7fffffff;
		for (int k=Path[t];k;k=Path[g.U[k]]){
			if (flow>g.Cap[k]) flow=g.Cap[k];
		}
		for (int k=Path[t];k;k=Path[g.U[k]]){
			g.Cap[k]-=flow;
			g.Cap[k^1]+=flow;
		}
	}
}
void mcmf(int s,int t) {
    maxflow = 0;
    mincost = 0;
    while(1 == spfa(s,t)) {
        int aug = INF;
        for(int v = t;v != s;v = pre[v])
            aug = min(aug, edge[pe[v]].cap);
        maxflow += aug;
        mincost += dist[t] * aug;
        for(int v = t;v != s;v = pre[v]) {
            edge[pe[v]].cap -= aug;
            edge[pe[v]^1].cap += aug;
        }
    }
}
Example #9
0
	inline void solve()
	{
		for(int i = 1; i <= n; ++i)
			f[i] = INF;
		f[s] = 0;sort(e+1, e+m+1);
		for(int i = m; i >= 1; --i)
		{
			G.add_edge(e[i].u, e[i].v, e[i].d);
			if(f[e[i].u] > f[e[i].v]) swap(e[i].u, e[i].v);
			if(max(f[e[i].u], e[i].d) >= f[e[i].v]) continue;
			if(f[e[i].u] == INF) continue;
			spfa(e[i].u);
			if((long long)f[t]*ay < (long long)ax*e[i].d)
				ax = f[t], ay = e[i].d;
		}
	}
Example #10
0
void mcmf(){
    int mc = 0;
    while(!spfa()){
        int ff = 1;
        //for(int i=p[n+n+1]; ~i; i=p[e[i].u])
          //  ff = ff<e[i].f ? ff : e[i].f;

        for(int i=p[n+n+1]; ~i; i=p[e[i].u]){
            e[i].f -= ff;
            e[i^1].f += ff;
        }
    
        mc += ff * (10000 - cost[n+n+1]);
    }
    printf("%d\n", mc);
}
Example #11
0
int main()
{
	int m, a, b, c;
	while(scanf("%d %d", &n, &m) != EOF)
	{
		memset(first, -1, sizeof(first));
		tot = 0;
		while(m--)
		{
			scanf("%d %d %d", &a, &b, &c);
			add(a, b, c);
		}
		spfa();
	}
	return 0;
}
Example #12
0
int main(int argc, const char *argv[]) {
  int i, j, k, l, m;
  ms(head, -1), ms(next, -1), ms(visit, 0);
  scanf("%i %i", &n, &m);
  for (i = 0; i < m; ++i) {
    scanf("%i %i %i", &j, &to[i], &value[i]);
    next[i] = head[j];
    head[j] = i;
  }
  if (spfa(1) || d[n] < 0) {
    printf(fail);
  } else {
    printf("%i", d[n]);
  }
  return 0;
}
Example #13
0
PII flow() {
	PII ret(0, 0);
	while(spfa()) {
		int delta = Inf;
		for(int x = n - 1; x; x = pre[x]) {
			delta = std::min(delta, cap[pre[x]][x]);
		}
		for(int x = n - 1; x; x = pre[x]) {
			cap[pre[x]][x] -= delta;
			cap[x][pre[x]] += delta;
		}
		ret.first += delta;
		ret.second += dis[n - 1] * delta;
	}
	return ret;
}
Example #14
0
int main()
{
	scanf("%d%d%d",&n,&p,&k);
	for (int i=1;i<=p;++i)
	{
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		g.AddEdge(x,y,w);
	}
	spfa();
	int ans=0x7fffffff;
	for (int i=0;i<=k;++i)
	{
		if (ans>f[n][i]) ans=f[n][i];
	}
	printf("%d\n",ans);
	return 0;
}
Example #15
0
int mincost_maxflow()
{
    int max = 0, i, j, t;
    while (spfa())
    {
        i = n;
        while (pre[i] != -1)
        {
            t = pre[i];
            e[t].f--;
            e[e[t].op].f++;
            e[e[t].op].c = -e[t].c;
            i = e[t].u;
        }
        max += -d[n];
    }
    return max;
}
int main()
{
	int m,q;
	scanf("%d%d%d",&n,&m,&q);
	while(m--)
	{
		int a,b,d;scanf("%d%d%d",&a,&b,&d);
		inlink(a,b,d);  // a - b >= -d
	}
	while(q--)
	{
		int a,b,d;scanf("%d%d%d",&a,&b,&d);
		inlink(b,a,-d); // b - a >= d
	}
	for(int i=2;i<=n;i++) inlink(i,i-1,0);// i - (i-1) >= 0
	printf("%d\n",spfa());
	return 0;
}
    pair <long long, long long> solve(){
        int i, j;
        long long mincost = 0, maxflow = 0;

        while (spfa()){
            long long aug = INF;
            for (i = t, j = from[i]; i != s; i = adj[j ^ 1], j = from[i]){
                aug = min(aug, cap[j] - flow[j]);
            }
            for (i = t, j = from[i]; i != s; i = adj[j ^ 1], j = from[i]){
                flow[j] += aug, flow[j ^ 1] -= aug;
            }

            /// change here as per the problem
            maxflow += aug, mincost += aug * dis[t];
        }
        return make_pair(mincost, maxflow);
    }
Example #18
0
int main(){
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;++i){
		int x,y,w;
		scanf("%d %d %d",&x,&y,&w);
		AddEdge(x,y,w);
		AddEdge(y,x,w);
	}
	spfa();
	//printf("%d\n",ans);
	if (f[n]){
	print(n);
	printf("\n");
	}else {
	  printf("-1\n");
	}
	return 0;
}
Example #19
0
int main() {
    freopen("test.in", "r", stdin);
    int n, m;
    char str[1001];
    while(scanf("%d%d", &n, &m) != EOF) {
        if (!n && !m) {
            break;
        }
        cntmen = cnthouse = 0;
        memset(edge, 0, sizeof(edge));
        memset(mempool, 0, sizeof(mempool));
        memnum = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%s", str);
            for (int j = 0; j < m; ++j) {
                if (str[j] == 'm') {
                    men[++cntmen].x = i;
                    men[cntmen].y = j;
                } else if (str[j] == 'H') {
                    house[++cnthouse].x = i;
                    house[cnthouse].y = j;
                }
            }
        }
        S = 0, T = cntmen + cnthouse + 1;
        for (int i = 1; i <= cntmen; ++i) {
            for (int j = 1; j <= cnthouse; ++j) {
                add(i, j + cntmen, mandis(men[i], house[j]), 1);
            }
        }
        for (int i = 1; i <= cntmen; ++i) {
            add(S, i, 0, 1);
        }
        for (int j = 1; j <= cnthouse; ++j) {
            add(j + cntmen, T, 0, 1);
        }
        cost = 0;
        while(spfa()) {
            aug();
        }
        printf("%d\n",cost);
    }
    return 0;
}
Example #20
0
double MCMF()
{
    double mincost=0;
    int maxflow=0;
    while (spfa())
    {
	int nec=inf;
	for (int now=pre[T]; now!=-1; now=pre[e[now].u])
	    nec=std::min(nec,e[now].f);
	mincost+=nec*dis[T];
	maxflow+=nec;
	for (int now=pre[T]; now!=-1; now=pre[e[now].u])
	{
	    e[now].f-=nec;
	    e[now^1].f+=nec;
	}
    }
    return mincost;
}
Example #21
0
int mincost()
{
    int cost=0,maxflow=0;
    while (spfa())
    {
	int nec=inf;
	for (int now=pre[T]; now!=-1; now=pre[e[now].u])
	    nec=std::min(nec,e[now].cap);
	for (int now=pre[T]; now!=-1; now=pre[e[now].u])
	{
	    e[now].cap-=nec;
	    e[now^1].cap+=nec;
	}
	maxflow+=nec;
	cost+=nec*dis[T];
    }
    if (maxflow==2) return cost;
    else return -1;
}
Example #22
0
void work()
{
	if(n<=1)
	{
		printf("0\n");
		return;
	}
	spfa(1);
	for(int i=2;i<=n;++i)
	{
		if(dis[i]>=oo)
		{
			printf("No Answer\n");
			return;
		}
		ans+=dis[i]*w[i];
	}
	printf("%I64d\n",ans);
}
int main()
{
    int i,f,ans;
    while(scanf("%d",&n)!=EOF)
    {
        chu(); 
        for(i=1;i<=n;i++)
        {
            for(f=1;f<=n;f++)
            {
                scanf("%d",&map[i][f]);
            }
        }    
        ans=spfa();
        ans=min(ans,spfahuan());
        printf("%d\n",ans);
    }
    return 0;
}
Example #24
0
int main(){
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;++i){
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		int t=(i<<1)-1;
		Data[t]=y;
		Wei[t]=w;
		Pre[t]=Connect[x];
		Connect[x]=t;

		Data[++t]=x;
		Wei[t]=w;
		Pre[t]=Connect[y];
		Connect[y]=t;
	}
	spfa();
	printf("%d\n",(f[n]==2147483647)?-1:f[n]);
	return 0;
}
int main(){
    int k, p, i, m, v1, v2, cost;
    freopen("data.in", "r", stdin);
    scanf("%d", &k);
    while(k--){
        ep = 0;
        memset(head, -1, sizeof(head));
        memset(e, 0, sizeof(e));
        scanf("%d%d%d%d", &n, &m, &p, &q);
        for(i = 1; i <= n; i++) scanf("%d", &troop[i]);
        for(i = 1; i <= p; i++){
            scanf("%d%d%d", &v1, &v2, &cost);
            addedge(v1, v2, cost);
            addedge(v2, v1, cost);
        }
        spfa();
    }

    return 0;
}
Example #26
0
File: C.c Project: mayukuner/HITCS
int main(){
#ifdef QWERTIER
  freopen("in.txt","r",stdin);
#endif 
  int T, m, kase = 1;
  scanf("%d", &T);
  while(T--){
    int u, v, w;
    scanf("%d%d", &n, &m);
    memset(le, 0 ,sizeof(le));
    ecnt = 0;
    while(m--){
      scanf("%d%d%d", &u, &v, &w);
      addEdge(u - 1, v - 1, w);
      addEdge(v - 1, u - 1, w);
    }
    printf("Scenario #%d:\n%d\n\n", kase++, spfa(0));
  }
  return 0;
}
 int mincost_maxflow(int s,int t)
 {
 	this->beg=s;this->end=t;
     flow=0,cost=0;
     while(spfa())
     {
         int Min=INT_MAX;
         for(int i=end;i!=beg;i=pre[i])
             if(Min>E[path[i]].flow)
                 Min=E[path[i]].flow;
         for(int i=end;i!=beg;i=pre[i])
         {
             E[path[i]].flow-=Min;
             E[path[i]^1].flow+=Min;
         }
         flow+=Min;
         cost+=dis[end];
     }
     return cost;
 }
 int min_cost_max_flow(int src, int dst, int n){
     int maxflow = 0, mincost = 0;
     for(;;){
         if( !spfa(src, dst, n)){
             return mincost ;
         }
         int aug = oo;
         for(int i = from[dst]; i != -1; i = from[name[i^1]] ){
             checkMin( aug, flow[i] );
         }
         if( !aug ) return mincost;
  
         maxflow += aug;
         mincost += sp[dst] * aug;
         for(int i = from[dst]; i != -1; i = from[name[i^1]] ){
             flow[i] -= aug;
             flow[i^1] += aug;
         }
     }
     return mincost;
 }
Example #29
0
int main (void)
{
    int n,st,ed;
    while(cin >> n >> st >> ed){
        init(n+1);
        for (int i=0;i<n;i++){
            int x,y,nn;
            bool first = true;
            x = i+1;
            cin >> nn;
            while(nn--){
                cin >> y;
                if (first) first = false,add_edge(x,y,0);
                else add_edge(x,y,1);
            }
        }
        spfa(st);
        if (dist[ed]==INF) cout << -1 << endl;
        else   cout << dist[ed] << endl;
    }
}
Example #30
0
int main() {

    scanf("%d", &interval_number);
    max_point = edge_number = 0;
    memset(vis, 0, sizeof(vis));
    memset(head, -1, sizeof(head));
    for (int i = 1; i <= interval_number; i++) {
        int start, end, value;
        scanf("%d%d%d", &start, &end, &value);
        end++;
        addEdge(start, end, value);
        max_point = max(max_point, end);
    }
    for (int i = 0; i < max_point; i++) {
        addEdge(i, i + 1, 0);
        addEdge(i + 1, i, -1);
    }
    spfa();
    printf("%d\n", distance[max_point]);
    return 0;
}