LightOJ1086-Jogging Trails -状态压缩,欧拉回路

题目大意:给你一张单图,你需要遍历每条边最少一次,并且要回到一开始的起点,你可以自定义起点,问最少要走多少路;

题目解析:首先我们要知道这道题目肯定是关于欧拉回路的;

欧拉回路:无向图每个点的度数都是偶数,就可以正好遍历每条边一次并回到起点;

所以本题就是要我们构造欧拉回路,我们把度数为奇数的节点构造出来,dp  的时候取出两个点,代价就是他们之间的最短路,所以我们就要用floyd把最短路初始化出来,dp最好用记忆化搜索,所以DFS即可;

AC代码:

#include  
#include  
#include  
#include  
#include  
using namespace std;  
const int inf=0x3f3f3f3f;  
int graph[17][17],dp[(1<<16)+10],cnt[17],n;  
int dfs(int f)  
{  
    int ans=inf,i,j;  
    if(!f)  return dp[0]=0;  
    if(dp[f]!=-1)   return dp[f];  
    for(i=0;i>cas;  
    for(c=1;c<=cas;c++)  
    {  
        scanf("%d%d",&n,&m);  
        for(i=0;i



你可能感兴趣的:(dp,图论)