hdu 4948 Kingdom
刚看到的时候感觉这个题有点熟悉 有点像拓扑排序的感觉 但是想了想感觉不对 他这个还限制了必须要在两个长度距离内到达该点 这个当时不知道该怎么解决。。
细看题目会发现 题目里面说了每两个点之间都只有一条单向的路 Every pair of cities has exactly a one-way road.
这个条件会使题目一下子变得简单了。。。只要将入度排序 按从大到小排 然后输出就可以了。。
之后的每个点都是符合要求的 可证
<span style="font-family:KaiTi_GB2312;font-size:18px;">#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
struct node
{
int rd,id;
bool operator <(const node &x)const
{
return x.rd>rd;
}
};
node no[510];
int main()
{
//freopen("ceshi.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
no[i].rd=0;
no[i].id=i;
}
for(int i=1;i<=n;i++)
{
char ch[510];
scanf("%s",ch);
for(int j=0;j<n;j++)
{
int tmp=ch[j]-'0';
if(tmp==1)
no[j+1].rd++;
}
}
sort(no+1,no+n+1);
printf("%d",no[1].id);
for(int i=2;i<=n;i++)
printf(" %d",no[i].id);
puts("");
}
return 0;
}</span>
按照题意原本想法写的代码如下 就是要判断之后的点是不是能在两个长度范围内到达自己即可:
<span style="font-family:KaiTi_GB2312;font-size:18px;">#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
vector <int> mp[510];
bool vis[510];
struct node
{
int rd,id;
bool operator <(const node &x)const
{
return x.rd>rd;
}
};
node no[510];
void dfs(int id,int dep)
{
vis[id]=1;
if(dep==2) return;
for(int i=0;i<mp[id].size();i++)
{
if(!vis[mp[id][i]])
dfs(mp[id][i],dep+1);
}
}
int main()
{
//freopen("ceshi.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
no[i].rd=0;
no[i].id=i;
}
for(int i=1;i<=n;i++)
{
char ch[510];
scanf("%s",ch);
for(int j=0;j<n;j++)
{
int tmp=ch[j]-'0';
if(tmp==1)
{
no[j+1].rd++;
mp[j+1].push_back(i);
}
}
}
sort(no+1,no+n+1);//入度按降序排列
int flag=1;
for(int i=1;i<=n;i++)
{
MEM(vis,0);
dfs(no[i].id,0);
for(int j=i+1;j<=n;j++)
{
if(vis[j]==0)
{
flag=1; break;
}
}
}
if(flag)
{
printf("%d",no[1].id);
for(int i=2;i<=n;i++)
printf(" %d",no[i].id);
puts("");
}
else printf("-1\n");
}
return 0;
}
</span>