标签:acm 拓扑排序
HDU 1258 链接:click here
HDU 3342 链接:click here
题意:
4 3 1 2 2 3 4 3
1 2 4 3
//HDU 1285 确定比赛名次
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn =550;
int G[maxn][maxn];
int indegree[maxn];
int V,m;
bool g[maxn];
void AOV_topsort( )
{
int flag = 1;
for( int i=1 ; i<V+1 ; i++ )
{
for( int j=1 ; j<V+1 ; j++ )
{
if(indegree[j] == 0 )
{
if(i!=V)
printf("%d ",j);
else printf("%d\n",j);
indegree[j]--;
for(int k=1 ; k<V+1; k++ )
{
if(G[j][k] == 1 )
{
indegree[k]--;
}
}
break;
}
}
}
}
int main()
{
while(cin>>V>>m)
{
memset(G ,0 ,sizeof(G) );
memset(g,false,sizeof(g) );
memset(indegree ,0,sizeof(indegree) );
int a,b;
for( int i=0 ; i<m ; i++ )
{
scanf("%d%d",&a,&b);
if(G[a][b]==0)
{
G[a][b]=1;
indegree[b]++;
}
}
AOV_topsort( );
}
return 0;
}
3 2 0 1 1 2 2 2 0 1 1 0 0 0
YES NO
跟上一题思路一样,注意判重
代码:
/* 拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
*/
//HDU 3342 Legal or Not
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn =550;
int G[maxn][maxn];
int indegree[maxn];
int V,m;
bool g[maxn];
void AOV_topsort( )
{
int flag = 1;
for( int i=1 ; i<V+1 ; i++ )
{
for( int j=0 ; j<V ; j++ )
{
if(indegree[j] == 0 )
{
if(g[j]==0)
{
g[j]=1;
indegree[j]--;
for(int k=0 ; k<V; k++ )
{
if(G[j][k] == 1 )
{
indegree[k]--;
}
}
}
}
}
}
for(int i=0 ; i<V ; i++ )
if(indegree[i]> 0)
{
flag = 0;
break;
}
if(flag==0)
puts("NO");
else
puts("YES");
}
int main()
{
while(cin>>V>>m&&V&&m)
{
memset(G ,0 ,sizeof(G) );
memset(g,false,sizeof(g) );
memset(indegree ,0,sizeof(indegree) );
int a,b;
for(int i=0 ; i<m ; i++ )
{
cin>>a>>b;
if(G[a][b]==0)
{
G[a][b]=1;
indegree[b]++;
}
}
int flag = 0;
for(int i=0; i<V; i++)
{
if(indegree[i]==0)
{
flag = 1;
break;
}
}
if(flag==0) puts("NO");
else AOV_topsort( );
}
return 0;
}
HDU 1258 确定比赛名次 &&HDU 3342 Legal or Not 【临接表+拓扑排序】
标签:acm 拓扑排序
原文地址:http://blog.csdn.net/u013050857/article/details/44309323