Ejemplo n.º 1
0
int main() {
	int casos, n, m, a, b, c, i, j, caso;

	scanf("%d", &casos);

	for (caso = 1; caso <= casos; caso++) {
		scanf("%d %d", &n, &m);

		/* preencher com 0 a matriz de adj sempre */
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				g[i][j] = 0;

		for (i = 0; i < m; i++) {
			scanf("%d %d %d", &a, &b, &c);
			a--;
			b--;
			g[a][b] = g[b][a] = c;
		}

		printf("%d\n", minCut(n));
	}

	return 0;
}
Ejemplo n.º 2
0
 int minCut(string s) {
     int res = INT_MAX;
     int part = 0;
     if(isPalindrome(s)) {
         return 0;
     }
     minCut(s, res, part);
     return res;
 }
Ejemplo n.º 3
0
double AlmostCliqueRule::computeMinCutValue(WorkingCopyGraph::NodeMap<bool>& candidate) {
  ConstMap<WorkingCopyGraph::Edge, double> zero(0.0);
  typedef LessMap<ConstMap<WorkingCopyGraph::Edge, double>, const WorkingCopyGraph::EdgeMap<double> > PositiveWeight;
  PositiveWeight posWeight(zero, _instance.getWeight());
  
  typedef SubGraph<const WorkingCopyGraph, WorkingCopyGraph::NodeMap<bool>, PositiveWeight> SubGraphPositiveWeight;
  SubGraphPositiveWeight candidatePosWeight(_instance.getGraph(), candidate, posWeight);
  
  HaoOrlin<SubGraphPositiveWeight, WorkingCopyGraph::EdgeMap<double> > minCut(candidatePosWeight, _instance.getWeight());
  minCut.init();
  minCut.calculateOut();
  return minCut.minCutValue();
}
Ejemplo n.º 4
0
 void minCut(string s, int& res, int& part) {
     if(s.length() == 0) {
         res = min(res, part-1);
     }
     else {
         for(int i=1; i<=s.length(); i++) {
             string tmp = s.substr(0, i);
             if(isPalindrome(tmp)) {
                 part++;
                 minCut(s.substr(i), res, part);
                 part--;
             }
         }
     }
 }
	int minCut(string &s, int start, int cuts, vector<int> &scuts)
	{
        int minCuts = INT_MAX;
		if(start == s.size())	// found one
		{
			return cuts;
		}
		for(int i = start+1; i <= s.size(); i++)	// 依次考虑长度为1,2,3,..的子串是否是回文串
		{
			if(isPalindrome(s, start, i))			// 如果是,就递归的求后面部分的所有回文分割
			{
                
				int c = 1 + cuts;
                if (scuts[i] == INT_MAX) {
                    scuts[i] = minCut(s, i, 0, scuts);
                }
                
                c += scuts[i];
                minCuts = min(minCuts, c);
			}
		}
        
        return minCuts;
	}
Ejemplo n.º 6
0
void testMinCut(){
    string s = "ababababababababababababcbabababababababababababa";
    int res = minCut(s);
    cout << res << endl;
}
    int minCut(string s)
	{
        vector<int> scuts(s.size()+1, INT_MAX);
		return minCut(s, 0, 0, scuts)-1;
	}