這題是混合路的尤拉路徑問題。
1.判斷圖的連通性,若不連通,無解。
2.給無向邊任意定向,計算每個結點入度和出度之差deg[i]。deg[i]為奇數的結點個數只能是0個或2個,否則肯定無解。
3.(若存在2個deg[i]為奇數的結點,則在兩點連一條流量為1的邊,方向任意)設立源點s和匯點t(自己另外定兩個點),若某點i入度《出度,連邊(s,i,-deg[i]/2),若入度》出度,連邊(i,t,deg[i]/2);對於任意定向的無向邊(i,j,1)。
5.若從s發出的邊全部滿流,證明存在尤拉迴路(路徑),否則不存在。
view code#include #include #include #include #include #include using namespace std;
typedef
long
long ll;
const
int inf = 1<<30;
const
int n = 2010;
int _,cas=1, n, fa[30], pre[30], deg[30], s, t, d[30];
int cur[30];
bool vis[30];
struct edge
edge(int u, int v, int w, int next):u(u),v(v),cap(w),next(next) {}
}e[n<<1];
int ecnt;
void addedge(int u, int v, int w)
int find(int x)
void union(int u, int v)
bool is_ok()
return res==0 || res==2;
}bool bfs()}}
return vis[t];
}int dfs(int u, int c)
}return flow;
}int maxflow()
return flow;
}void solve()
t = -1;
printf("case %d: ", cas++);
if(!is_ok())
if(t!=-1) addedge(t, s, 1);
s = 26, t = 27;
int fulflow = 0, flow;
for(int i=0; i<26; i++)
flow = maxflow();
puts(flow==fulflow?"well done!":"poor boy!");
}int main()
hdu 3472 HS BDC 混合尤拉 網路流
題意就是問能否將給定的幾個單詞全部連線起來,兩個單詞能連線是當前乙個單詞的最後乙個字母等於後乙個單詞的首字母。還有一些單詞反向也沒有關係。建圖,每輸入乙個單詞,只看他的首尾字母,連線一條首字母到尾字母的有向邊,如果他可以反向,那麼再反向建立一條邊,即該邊是無向邊。然後就是乙個混合尤拉了。還有乙個注意...
混合尤拉 HDOJ 3472 HS BDC
題意 詞語接龍,給出 n個詞語,一些詞語可以反轉,問是否存在尤拉路徑。先判定圖是否連通,再判斷是否存在尤拉路徑 尤拉路徑的條件 滿足尤拉迴路或只存在兩個點為奇數。然後建圖 令 c 出度 入度 2,若出度大於入度,連邊s,i容量為 c,反之連i,t容量為c。若求尤拉路徑,設兩個奇數的點為 k1,k2 ...
JOJ 2727 GRE(混合尤拉路)
演算法基本和sightseeing tour一樣,但是要注意判斷圖的連通性,而且要放寬判斷條件,存在2個度為奇的點時,則要新增一條邊構成迴路 普通ek演算法 include include include include include define min a,b a b b a using na...