您的位置:首页 > 其它

POJ 1637 Sightseeing Tour

2010-11-26 17:00 274 查看
混合图判定是否存在欧拉回路,自己一开始就没想对,看了网上别人的思路
http://www.cnblogs.com/destinydesigner/archive/2009/09/28/1575674.html
代码:

#include<iostream>
using namespace std;
#define inf 999999
#define MAX 205
#define min(x,y) (x)<(y)?(x):(y)
int cap[MAX][MAX],f[MAX][MAX];
int pre[MAX],q[MAX],rc[MAX];
int indegree[MAX],outdegree[MAX];
int m,s,S,T,max_flow,sum;
bool bfs()
{
int i,j,head=0,tail=1;
memset(rc,0,sizeof(rc));
pre[S]=-1;
rc[S]=inf;
q[tail]=S;
while(head<tail)
{
i=q[++head];
for(j=1;j<=T;j++)
{
if(cap[i][j]>f[i][j]&&!rc[j])
{
rc[j]=min(rc[i],cap[i][j]-f[i][j]);
pre[j]=i;
q[++tail]=j;
if(j==T)
return true;
}
}
}
return false;
}
void update()
{
for(int i=T;i!=S;i=pre[i])
{
f[pre[i]][i]+=rc[T];
f[i][pre[i]]=-f[pre[i]][i];
}
max_flow+=rc[T];
}
void EK()
{
while(bfs())
update();
}
void construct()
{
int i,j;
sum=0;
/*for(i=1;i<=m;i++)
for(j=i+1;j<=m;j++)
{
if(g[i][j]==0)
{
cap[i][j]=1;
}
}*/
for(i=1;i<=m;i++)
{
if(indegree[i]>outdegree[i])
{
cap[i][T]=(indegree[i]-outdegree[i])/2;
}
else if(indegree[i]<outdegree[i])
{
cap[S][i]=(outdegree[i]-indegree[i])/2;
sum+=cap[S][i];
}
}
}
int main()
{
int i,j,test,a,b,flag;
cin>>test;
while(test--)
{
memset(cap,0,sizeof(cap));
memset(f,0,sizeof(f));
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
scanf("%d %d",&m,&s);
S=0;
T=m+1;
for(i=1;i<=s;i++)
{
scanf("%d%d%d",&a,&b,&j);
indegree[b]++;
outdegree[a]++;
if(j==0)
cap[a][b]++;//这里一开始直接赋值为1,wa了好几次
}
flag=1;
for(i=1;i<=m;i++)
{
if((indegree[i]-outdegree[i])%2==1)
{
flag=0;
break;
}
}
if(!flag)
{
printf("impossible/n");
continue;
}
construct();
max_flow=0;
EK();
if(max_flow==sum)
{
printf("possible/n");
}
else
{
printf("impossible/n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: