| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
蒟蒻贴一份ek+邻接矩阵的ac代码,勿喷,204ms#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxN=205,inf=0x3f3f3f3f;
int cap[maxN][maxN],pre[maxN],flow[maxN],m,s,in[maxN],out[maxN],sum;
bool build()
{
sum=0;
memset(cap,0,sizeof(cap));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d%d",&m,&s);
while (s--)
{
int i,j,k;
scanf("%d%d%d",&i,&j,&k);
if (!k) cap[i][j]++;
in[j]++,out[i]++;
}
for (int i = 1; i <= m; i++)
{
if ((in[i]-out[i])&1)
return false;
if (out[i]>in[i]) sum+=(cap[0][i]=((out[i]-in[i])>>1));
else if (in[i]>out[i]) cap[i][m+1]=((in[i]-out[i])>>1);
}
return true;
}
int bfs(int src,int des)
{
memset(pre,-1,sizeof(pre));
pre[src]=-2;
flow[src]=inf;
queue<int> q;
q.push(src);
while (!q.empty())
{
int front=q.front();
q.pop();
if (front==des) return flow[des];
for (int i = 0; i <= m+1; i++)
{
if (!~pre[i]&&cap[front][i]>0)
{
flow[i]=min(flow[front],cap[front][i]);
pre[i]=front;
q.push(i);
}
}
}
return -1;
}
int ek(int src,int des)
{
int ret=0,k,d,x;
while (~(d=bfs(src,des)))
{
k=des;
while (k!=src)
{
x=pre[k];
cap[x][k]-=d;
cap[k][x]+=d;
k=x;
}
ret+=d;
}
return ret;
}
int main()
{
// freopen("D:\\input.txt","r",stdin);
int kase;
scanf("%d",&kase);
while (kase--)
{
if (!build())
{
puts("impossible");
continue;
}
if (ek(0,m+1)==sum) puts("possible");
else puts("impossible");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator