1. 程式人生 > >HDOJ 2647(拓撲排序)

HDOJ 2647(拓撲排序)

nbsp sort pan front push hdoj 2647 std cst class

#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
int n,m,inbug[10100],d[10100],sum;
vector<int>e[10100]; 
void topsort()
{
    queue<int
>q; for(int i=1;i<=n;i++) if(inbug[i]==0) { q.push(i); d[i]=888; } while(!q.empty()) { int now=q.front(); q.pop(); sum++; for(int i=0;i<e[now].size();i++) { if(--inbug[e[now][i]]==0) { q.push(e[now][i]); d[e[now][i]]
=min(d[e[now][i]],d[now]+1); } } } } int main(int argc, char *argv[]) { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<=n;i++) e[i].clear(); memset(inbug,0,sizeof(inbug)); memset(d,0x3f3f3f3f,sizeof(d)); for(int i=0;i<m;i++) {
int v,u; scanf("%d%d",&v,&u); e[u].push_back(v); inbug[v]++; } sum=0; topsort(); int ans=0; if(sum==n) { for(int i=1;i<=n;i++) { if(d[i]!=0x3f3f3f3f) ans+=d[i]; } printf("%d\n",ans); } else printf("-1\n"); } return 0; }

HDOJ 2647(拓撲排序)