上交模板过不了,改了好久,还是过不了,嘛嘛,改了一周了,实在不知道哪里错了,果断还是自己写一个算了……
混合图欧拉回路就是在图中,有些边是有向的有些边是无向的,然后判断有没有欧拉回程。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define sc(a,b) scanf("%d%d",&a,&b) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 100005 #define MN 500 #define INF 0x7fffffff #define eps 1e-7 using namespace std; typedef long long ll; struct edge { int v,w,next; } e[MM]; int head[MN],in[MN],vis[MN],node[MM][3],cnt; void add(int u,int v,int w) { e[cnt].v=v,e[cnt].w=w,e[cnt].next=head[u],head[u]=cnt++; e[cnt].v=u,e[cnt].w=0,e[cnt].next=head[v],head[v]=cnt++; } bool bfs(int st,int en) { mem(vis,0); queue<int>q; q.push(st); vis[st]=1; while(!q.empty()) { int u=q.front(); q.pop(); if(u==en) return true; for(int i=head[u]; i>=0; i=e[i].next) { int v=e[i].v; if(e[i].w && vis[v]==0) { vis[v]=vis[u]+1; q.push(v); } } } return false; } int dfs(int u,int flow,int en) { if(u==en) return flow; int sum=0; for(int i=head[u]; i>=0 && sum<flow; i=e[i].next) { int v=e[i].v; if(e[i].w >0 && vis[v]==vis[u]+1) { int tmp=dfs(v,min(flow-sum,e[i].w),en); e[i].w-=tmp; e[i^1].w+=tmp; sum+=tmp; } } if(!sum) vis[u]=0; return sum; } int dinic(int st,int en) { int ans=0,tmp; while(bfs(st,en)) { while(tmp=dfs(st,INF,en)) ans+=tmp; } return ans; } bool solve(int n,int m) //n为点数,m为边数 { int i,sum=0; memset(head,-1,sizeof(head)); mem(in,0); cnt=0; for(i=0;i<m;i++) { --in[node[i][0]],++in[node[i][1]]; if(!node[i][2]) add(node[i][0],node[i][1],1); } for(i=1; i<=n; i++) if(in[i]&1) return false; for(int i=1; i<=n; i++) { if(in[i]<0) add(0,i,(-in[i])>>1); if(in[i]>0) add(i,n+1,in[i]>>1),sum+=(in[i]>>1); } if(sum==dinic(0,n+1)) return true; //存在欧拉回路 return false; } int main() { int t,n,m,i; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) scanf("%d%d%d",&node[i][0],&node[i][1],&node[i][2]); if(solve(n,m)) puts("possible"); else puts("impossible"); } return 0; }