首页 > 代码库 > hdu 4948

hdu 4948

由于最后一个被发展的城市一定是入度最大的,那么把入度最大的当成最后一个,同理,入度第二的当成倒数第二个。

然后判断当前点能否2步之内走到所有剩下的点即可,这里反向建图比较好处理。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<string>
#define eps  1e-12
#define INF   0x7fffffff
#define maxn 22222
using namespace std;
vector<int> mp[555];
vector<int> fmp[555];
char a[555];
struct node
{
    int in,id;
    bool operator <(const node &x)const
    {
        return in>x.in;
    }
}t[555];
int cnt[555];
bool vis[555];
void dfs(int now,int dep)
{
    vis[now]=1;
    if(dep==2) return ;
    for(int i=0;i<fmp[now].size();i++)
    {
        if(!vis[fmp[now][i]])
        {
            dfs(fmp[now][i],dep+1);
        }
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<=n;i++) fmp[i].clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",a+1);
            for(int j=1;j<=n;j++)
            {
                if(a[j]=='1') fmp[j].push_back(i),cnt[j]++;
            }
        }
        for(int i=1;i<=n;i++)
        {
            t[i].id=i;
            t[i].in=cnt[i];
        }
        sort(t+1,t+1+n);
        int flag=1;
        for(int i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            dfs(t[i].id,0);
            for(int j=i+1;j<=n;j++)
            {
                if(vis[j]==0)
                {
                    flag=1;
                    break;
                }
            }
        }
        if(flag)
        {
            for(int i=n;i>=1;i--)
            {
                if(i!=n) putchar(' ');
                printf("%d",t[i].id);
            }
            puts("");
        }
        else puts("-1");
    }
    return 0;
}