题意:判断有无环路;
思路:拓扑排序;
两种写法:
结构体+指针:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
struct node{
int du;
node *next;
}q[50010];
int topo()
{
node *p;
int *shu=new int[50010];
int i,j,k=0,num;
while(1)
{
num=0;
memset(shu,0,sizeof(shu));
for(i=0;i<n;i++)
{
if(q[i].du==-1) continue;
if(q[i].du==0)
{
shu[num++]=i;
q[i].du=-1;
k++;
}
}
if(num==0&&k<=n) return 0;
if(k==n) return 1;
for(i=0;i<num;i++)
{
p=q[shu[i]].next;
while(p)
{
q[p->du].du--;
p=p->next;
}
}
}
}
int main()
{
int a,b,i,k,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
q[i].du=0;
q[i].next=NULL;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
q[a].du++;
node *t=new node;
t->du=a;
t->next=q[b].next;
q[b].next=t;
}
if(topo()) printf("YES\n");
else printf("NO\n");
}
return 0;
}
STL,队列:
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int con[500010],n,m;
vector<int> g[500010];
int topo()
{
int sum=n;
queue<int> q;
int flag=0;
for(int i=0;i<n;i++)
if(con[i]==0) q.push(i);
while(!q.empty())
{
sum--;
int j=q.front();
q.pop();
for(int k=0;k<g[j].size();k++)
{
if(--con[g[j][k]]==0) q.push(g[j][k]);
}
}
if(sum>0) return 0;
else return 1;
}
int main()
{
int i,j,k,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
for(i=0;i<=n;i++)
{
con[i]=0;
g[i].clear();
}
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
g[a].push_back(b);
con[b]++;
}
if(topo()) printf("YES\n");
else printf("NO\n");
}
return 0;
}