建个图,套个模板。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
using namespace std;
#define INF 0x3ffffff
struct node
{
int u,v,next,re,w;
}edge[20001];
int first[2001],dis[2001];
int in[2001],out[2001];
int t,str,end;
void CL()
{
t = 1;
memset(first,-1,sizeof(first));
}
void add(int u,int v,int w)
{
edge[t].u = u;
edge[t].v = v;
edge[t].w = w;
edge[t].re = t + 1;
edge[t].next = first[u];
first[u] = t ++;
edge[t].u = v;
edge[t].v = u;
edge[t].w = 0;
edge[t].re = t - 1;
edge[t].next = first[v];
first[v] = t ++;
}
int bfs()
{
int u,v,i;
memset(dis,-1,sizeof(dis));
queue<int> que;
que.push(str);
dis[str] = 0;
while(!que.empty())
{
u = que.front();
que.pop();
for(i = first[u];i != -1;i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > 0&&dis[v] < 0)
{
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
if(dis[end] > 0) return 1;
else return 0;
}
int dfs(int u,int step)
{
int i,temp,v,tf = 0;
if(u == end) return step;
for(i = first[u];i != -1;i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > 0&&dis[v] == dis[u] + 1&&(temp = dfs(v,min(step,edge[i].w))))
{
edge[i].w -= temp;
edge[edge[i].re].w += temp;
return temp;
}
}
if(!tf) dis[u] = -1;
return tf;
}
int main()
{
int t,i,u,v,k,n,m;
scanf("%d",&t);
while(t--)
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d%d",&n,&m);
CL();
str = 0;
end = n + 1;
for(i = 0;i < m;i ++)
{
scanf("%d%d%d",&u,&v,&k);
in[u] ++;
out[v] ++;
if(k != 1)
add(u,v,1);
}
for(i = 1;i <= n;i ++)
{
if(abs(in[i]-out[i])%2 == 1)
break;
}
if(i != n+1)
{
printf("impossible\n");
continue;
}
int sum = 0;
for(i = 1;i <= n;i ++)
{
if(in[i] > out[i])
{
add(str,i,(in[i]-out[i])/2);
sum += (in[i]-out[i])/2;
}
else
{
add(i,end,(out[i]-in[i])/2);
}
}
int ans = 0,res;
while(bfs())
{
while(res = dfs(str,INF))
ans += res;
}
if(ans == sum)
printf("possible\n");
else
printf("impossible\n");
}
return 0;
}
POJ 1637 Sightseeing tour(混合图的欧拉回路),布布扣,bubuko.com
时间: 2024-12-22 10:49:47