Combinatorial Optimization consists in finding a "best" choice among a finite (but usually very large) set of possibilities. We find and use structural properties of the problems we consider ("good" caracterizations, decompositions, ...) in order to design efficient algorithms (exact or approximate) or to show that such algorithms do not exist.