首页 > 代码库 > 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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。