您的位置:首页 > 其它

pku 2594 Floyd+最小路径覆盖

2009-06-07 21:59 281 查看
pku 2594 大意是说给定一个有向无环图,用最少的路径去覆盖整个图,路径间允许顶点相交
这个题一看就觉得是最小路径覆盖,可是允许顶点相交想了一会儿。说白了就一句话
既然允许顶点相交,那就要把连通性也传递下去,这样就可以变换到标准的最小路径覆盖问题

贴个代码,只此一次 主要是我的代码很很很丑

1 ///loves DL~~

2

3 #include <iostream>

4 #include <algorithm>

5

6 using namespace std;

7

8 const int MAXN=510;

9 bool gg[MAXN][MAXN];

int link[MAXN];

bool s[MAXN];

int m,n;

bool find(int x)

{

int i;

for(i=1;i<=n;i++){

if((!s[i])&&gg[x][i]){

s[i]=true;

if(link[i]==0||find(link[i])){

link[i]=x;

return true;

}

}

}

return false;

}

int main()

{

freopen("in.txt","r",stdin);

while(scanf("%d%d",&n,&m)!=EOF&&!(m==0&&n==0))

{

memset(gg,0,sizeof(gg));

memset(link,0,sizeof(link));

int i,j,k;

int st,e;

for(i=0;i<m;i++)

{

scanf("%d%d",&st,&e);

gg[st][e]=true;

}

////Floyd 求传递闭包

for(k=1;k<=n;k++)

{

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

if(gg[i][k]&&gg[k][j]&&!gg[i][j])

gg[i][j]=true;

}

}

}

////寻找最小路径覆盖

int ans=0;

for(i=1;i<=n;i++)

{

memset(s,false,sizeof(s));

if(find(i))

{

ans++;

}

}

printf("%d\n",n-ans);

}

return 0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: