您的位置:首页 > 其它

hdu 3342 Legal or Not(拓扑排序) HDOJ Monthly Contest – 2010.03.06

2015-05-05 23:49 447 查看
一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次……

题意也很裸,前面的废话不用看,直接看输入

输入n, m表示从0到n-1共n个人,有m组关系

截下来m组,每组输入a, b表示a指向b,或者b指向a也行。

输入n == 0时结束

如果可以拓扑排序,输出"YES",否则输出"NO"。每组输出占一行。

给两种代码吧,一种用邻接矩阵,另一种我也不知道叫什么好……

邻接矩阵——

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;

const int N = 110;

int mp

;
int n, m;
int a, b;
int dg
;

int main()
{
//freopen("test.txt", "r", stdin);
while(~scanf("%d%d", &n, &m) && n)
{
memset(dg, 0, sizeof(dg));
memset(mp, 0, sizeof(mp));
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
if(mp[a][b] == 0 && a != b)
{
dg[b]++;
mp[a][b] = 1;
}
}

queue<int> que;
for(int i = 0; i < n; i++)
{
if(!dg[i]) que.push(i);
}

int sum = 0;
while(!que.empty())
{
int p = que.front();
que.pop();
sum++;
dg[p]--;
for(int i = 0; i < n; i++)
{
if(mp[p][i])
{
dg[i]--;
if(!dg[i])
{
que.push(i);
}
}

}
}
if(sum == n) printf("YES\n");
else printf("NO\n");

}
return 0;
}


不知名——

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;

const int N = 110;

struct Node
{
int to;
int next;
}node
;

int head
;
int dg
;
int n, m;
int a, b;

int main()
{
//freopen("test.txt", "r", stdin);
while(~scanf("%d%d", &n, &m) && n)
{
memset(head, -1, sizeof(head));
memset(dg, 0, sizeof(dg));
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
node[i].to = b;
node[i].next = head[a];
head[a] = i;
dg[b]++;
}

int sum = 0;
queue<int>que;
for(int i = 0; i < n; i++)
{
if(!dg[i])
{
que.push(i);
}
}

while(!que.empty())
{
int p = que.front();
que.pop();
dg[p]--;
sum++;
for(int i = head[p]; i != -1; i = node[i].next)
{
int v = node[i].to;
dg[v]--;
if(!dg[v])
{
que.push(v);
}
}
}
if(sum == n) printf("YES\n");
else printf("NO\n");
}
return 0;
}


知道名字了,叫前向星标……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: