http://acm.hdu.edu.cn/showproblem.php?pid=1285
入门拓扑排序,注意 重边 !!!
O(n^2):
/* W w w mm mm 222222222 7777777777777 */
/* W w w w m m m m 222 22 7777 */
/* w w w w m m m m 22 777 */
/* w w w w m m m m 22 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* ww ww m mm m 222222222222222 77 */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=600;
int G[MAXN][MAXN],d[MAXN],vis[MAXN];
int n,m;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.in","r",stdin);
#endif
while(~scanf("%d%d",&n,&m))
{
memset(G,0,sizeof(G));
memset(d,0,sizeof(d));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(!G[x][y])
{
G[x][y]=1;
d[y]++;
}
}
int cnt=n;
memset(vis,0,sizeof(vis));
while(cnt--)
{
int u;
for(int i=1;i<=n;i++)
{
if(!d[i]&&!vis[i])
{
printf("%d",i);
vis[i]=1;
u=i;
break;
}
}
for(int v=1;v<=n;v++)
{
if(G[u][v])
{
G[u][v]=0;
d[v]--;
}
}
if(cnt)printf(" ");
else printf("\n");
}
}
}
O(n+m):
/* W w w mm mm 222222222 7777777777777 */
/* W w w w m m m m 222 22 7777 */
/* w w w w m m m m 22 777 */
/* w w w w m m m m 22 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* ww ww m mm m 222222222222222 77 */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=505;
int n,m;
int G[MAXN][MAXN];
int d[MAXN];
priority_queue<int,vector<int>,greater<int> >Q;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.in","r",stdin);
#endif
while(~scanf("%d%d",&n,&m))
{
memset(d,0,sizeof(d));
memset(G,0,sizeof(G));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(!G[x][y])
{
G[x][y]=1;
d[y]++;
}
}
while(!Q.empty())
{
Q.pop();
}
for(int i=1;i<=n;i++)
{
if(!d[i])
{
Q.push(i);
}
}
int cnt=0;
while(!Q.empty())
{
int u=Q.top();
printf("%d",u);
cnt++;
if(cnt<n)printf(" ");
else printf("\n");
Q.pop();
for(int v=1;v<=n;v++)
{
if(G[u][v])
{
G[u][v]=0;
d[v]--;
if(!d[v])
{
Q.push(v);
}
}
}
}
}
}