| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 5792 | Accepted: 2357 |
Description
Input
Output
Sample Input
4 5 8 2 1 0 1 3 0 4 1 1 1 5 0 5 4 1 3 4 0 4 2 1 2 2 0 4 4 1 2 1 2 3 0 3 4 0 1 4 1 3 3 1 2 0 2 3 0 3 2 0 3 4 1 2 0 2 3 1 1 2 0 3 2 0
Sample Output
possible impossible impossible possible
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<string> using namespace std; #define MAXN 255 #define INF 0xFFFFFF struct edge { int to,c,next; }; struct edge2 { int u,v,ty; }; edge e[99999]; edge2 ee[99999]; int deg[MAXN]; int que[MAXN*100],dis[MAXN],pre[MAXN]; int head[MAXN],head2[MAXN]; int st,ed,maxflow; int en,n,m; void add(int a,int b,int c) { e[en].to=b; e[en].c=c; e[en].next=head[a]; head[a]=en++; e[en].to=a; e[en].c=0; e[en].next=head[b]; head[b]=en++; } bool bfs() { memset(dis,-1,sizeof(dis)); que[0]=st,dis[st]=1; int t=1,f=0; while(f<t) { int j=que[f++]; for(int k=head[j];k!=-1;k=e[k].next) { int i=e[k].to; if(dis[i]==-1 && e[k].c) { que[t++]=i; dis[i]=dis[j]+1; if(i==ed) return true; } } } return false; } int update() { int p,flow=INF; for (int i=pre[ed];i!=-1;i=pre[i]) if(e[head2[i]].c<flow) p=i,flow=e[head2[i]].c; for (int i=pre[ed];i!=-1;i=pre[i]) e[head2[i]].c-=flow,e[head2[i]^1].c+=flow; maxflow+=flow; return p; } void dfs() { memset(pre,-1,sizeof(pre)); memcpy(head2,head,sizeof(head2)); for(int i=st,j;i!=-1;) { int flag=false; for(int k=head[i];k!=-1;k=e[k].next) if(e[k].c && (dis[j=e[k].to]==dis[i]+1) ) { pre[j]=i; head2[i]=k; i=j; flag=true; if(i==ed) i=update(); if(flag) break; } if (!flag) dis[i]=-1,i=pre[i]; } } int build() { int temp=0; memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++) { if(deg[i]) { if(deg[i]>0) add(i,ed,deg[i]); else { add(st,i,abs(deg[i])); temp+=deg[i]; } } } for(int i=1;i<=m;i++) if(!ee[i].ty) add(ee[i].u,ee[i].v,1); return temp; } void solve() { int a,b,c; scanf("%d%d",&n,&m); memset(deg,0,sizeof(deg)); st=0,ed=1+n; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); deg[a]--; deg[b]++; ee[i].u=a; ee[i].v=b; ee[i].ty=c; } for(int i=1;i<=n;i++) { if(deg[i]%2!=0) { printf("impossible\n"); return; } deg[i]/=2; } int fuflow=abs(build()); maxflow=0; while(bfs()) dfs(); if(maxflow==fuflow) printf("possible\n"); else printf("impossible\n"); } int main() { int t; scanf("%d",&t); while(t--) solve(); return 0; }
800




被折叠的 条评论
为什么被折叠?



