Esempio n. 1
0
	int Maxflow(int s, int t){
		int ret = 0, i, j;
		Bfs(t);
		for (i = 0; i < n; ++i) pre[i] = NULL, arc[i] = adj[i];
		for (i = 0; i < e; ++i) edge[i].flow = edge[i].cap;
		i = s;
		while (d[s] < n) {
			while (arc[i] && (d[i] != d[arc[i]->v]+1 || !arc[i]->flow)) arc[i] = arc[i]->next;
			if (arc[i]) {
				j = arc[i]->v;
				pre[j] = arc[i];
				i = j;
				if (i == t) {
					int update = INF;
					for (Edge *p = pre[t];p != NULL;p = pre[p->re->v]) checkmin(update, p->flow);
					ret += update;
					for (Edge *p = pre[t];p != NULL;p = pre[p->re->v]) p->flow -= update, p->re->flow += update;
					i = s;
				}
			}
			else {
				int min = n - 1;
				for (Edge *p = adj[i];p != NULL;p = p->next) if(p->flow) checkmin(min, d[p->v]);
				if (--numb[d[i]] == 0) return ret;
				d[i] = min + 1;
				++numb[d[i]];
				arc[i] = adj[i];
				if (i != s) i = pre[i]->re->v;
			}
		}
		return ret;
	}
Esempio n. 2
0
	int solve(string s,string t)
	{
		if(s==t) return 0;
		string buf=s+"  "+t;
		if(M.find(buf)!=M.end()) return M[buf];
		int ret=10000;
		int L=LN(s);
		if(s[0]==t[0]) checkmin(ret,solve(s.substr(1),t.substr(1)));
		if(s[L-1]==t[L-1]) checkmin(ret,solve(s.substr(0,L-1),s.substr(0,L-1)));
		for(int i=0;i<L-1-i;i++) swap(s[i],s[L-1-i]);
		if(s[0]==t[0]) checkmin(ret,solve(s.substr(1),t.substr(1))+1);
		if(s[L-1]==t[L-1]) checkmin(ret,solve(s.substr(0,L-1),t.substr(0,L-1))+1);
		return M[buf]=ret;
	}
Esempio n. 3
0
void Floyd()
{
	int i,j,k;
	for(k=0;k<n;k++)
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				checkmin(dist[i][j],dist[i][k]+dist[k][j]);
}
Esempio n. 4
0
void tarjan(int x) {
    in[s[++s[0]] = x] = true;
    dfn[x] = low[x] = ++idx;
    for (int k = h[x]; k; k = nxt[k])
        if (!dfn[p[k]]) {
            tarjan(p[k]);
            checkmin(low[x], low[p[k]]);
        }
        else if (in[p[k]])
            checkmin(low[x], dfn[p[k]]);
    if (low[x] == dfn[x]) {
        ++cnt;
        do {
            c[s[s[0]]] = cnt;
            in[s[s[0]]] = false;
        } while (s[s[0]--] != x);
    }
}
Esempio n. 5
0
void Floyd()
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)if(dist[i][k]!=-1)
			for(j=1;j<=n;j++)if(dist[k][j]!=-1)
				if(dist[i][j]==-1)dist[i][j]=dist[i][k]+dist[k][j];
				else checkmin(dist[i][j],dist[i][k]+dist[k][j]);
}
Esempio n. 6
0
int main() {
    int n, c;
    LL t, ans = 0;
    scanf("%d%lld", &n, &t);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            r[0][i][j] = t + 1;
    for (int i = 1, x, y, z; i <= n; ++i) {
        scanf("%d%d", &x, &y);
        for (int j = 1; j <= x; ++j)
            scanf("%d", &a[j]);
        for (int j = 1; j <= x; ++j) {
            scanf("%d", &z);
            checkmin(r[0][i][a[j]], y + z);
        }
    }
    for (c = 1; c < MAXR; ++c) {
        LL u = t + 1;
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j) {
                r[c][i][j] = t + 1;
                for (int k = 1; k <= n; ++k)
                    checkmin(r[c][i][j], r[c - 1][i][k] + r[c - 1][k][j]);
                checkmin(u, r[c][i][j]);
            }
        if (u > t)
            break;
    }
    for (--c; c >= 0; --c) {
        LL u = t + 1;
        for (int i = 1; i <= n; ++i) {
            q[i] = t + 1;
            for (int j = 1; j <= n; ++j)
                checkmin(q[i], p[j] + r[c][j][i]);
            checkmin(u, q[i]);
        }
        if (u <= t) {
            ans += 1LL << c;
            memcpy(p, q, sizeof q);
        }
    }
    printf("%lld\n", ans);
    return 0;
}
Esempio n. 7
0
 int minDistance(string word1, string word2) {
     int m = word1.length(), n = word2.length();
     vector<vector<int> > dp(m+1, vector<int>(n+1, -1));
     dp[0][0] = 0;
     for(int i = 0; i <= m; i++) {
         for(int j = 0; j <= n; j++) {
             if(dp[i][j] >= 0) {
                 // insert & remove
                 if(i<m) checkmin(dp[i+1][j], 1+dp[i][j]);
                 if(j<n) checkmin(dp[i][j+1], 1+dp[i][j]);
                 // modify
                 if(i<m && j<n) checkmin(dp[i+1][j+1], 1+dp[i][j]);
                 // match
                 if(i<m && j<n && word1[i]==word2[j])
                     checkmin(dp[i+1][j+1], dp[i][j]);
             }
         }
     }
     return dp[m][n];
 }
void sort(struct node *head)
{

	struct node *p = head;
	while (p->next != NULL)
	{
		checkmin(p);
		p = p->next;
	}
	

}
Esempio n. 9
0
File: 2599.cpp Progetto: Eopxt/OI
void dfs1(int x, int pre) {
    if (d[x] > m)
        return;
    if (v[m - d[x]] == now)
        checkmin(ans, c[m - d[x]] + e[x]);
    for (int k = h[x]; ~k; k = nxt[k])
        if (mk[k] && p[k] != pre) {
            d[p[k]] = d[x] + w[k];
            e[p[k]] = e[x] + 1;
            dfs1(p[k], x);
        }
}
Esempio n. 10
0
File: 2599.cpp Progetto: Eopxt/OI
void dfs2(int x, int pre) {
    if (d[x] > m)
        return;
    if (v[d[x]] != now) {
        c[d[x]] = e[x];
        v[d[x]] = now;
    }
    else
        checkmin(c[d[x]], e[x]);
    for (int k = h[x]; ~k; k = nxt[k])
        if (mk[k] && p[k] != pre)
            dfs2(p[k], x);
}