标签:des style http java color strong
题目链接:
题目:
3 2 0 1 1 2 2 2 0 1 1 0 0 0
YES NO
这个题目我用了两种方法,先说第一种比较正规的方法吧---拓扑排序。
如果形成一个环,则必然最后会出现所有的点有入度,故在外面判断一下即可。
代码为:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100+10;
int map[maxn][maxn],in[maxn];
bool vis[maxn];
int n,m;
void solve()
{
int cnt=0,i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(!in[j]&&!vis[j])
{
vis[j]=true;
cnt++;
for(k=0;k<n;k++)
{
if(map[j][k])
{
map[j][k]=0;
in[k]--;
}
}
break;
}
}
if(j==n)
{
printf("NO\n");
return;
}
}
if(cnt==n)
printf("YES\n");
else
printf("NO\n");
return;
}
int main()
{
int u,v;
while(~scanf("%d%d",&n,&m),n,m)
{
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
memset(vis,false,sizeof(vis));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
if(!map[u][v])
{
map[u][v]=1;
in[v]++;
}
}
solve();
}
return 0;
}
代码为:
<pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<iostream>
#define INF 0x3f3f3f
using namespace std;
const int maxn=100+10;
int dis[maxn][maxn];
int main()
{
int n,m,u,v,flag;
while(~scanf("%d%d",&n,&m),n,m)
{
flag=0;
memset(dis,0,sizeof(dis));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
dis[u][v]=1;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);
//cout<<i<<" "<<j<<" "<<dis[i][j]<<endl;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)
continue;
//cout<<dis[i][j]<<" "<<dis[j][i]<<endl;
if(dis[i][j]&&dis[j][i])
{
flag=1;
break;
}
if(flag)
break;
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
hdu3342Legal or Not,布布扣,bubuko.com
标签:des style http java color strong
原文地址:http://blog.csdn.net/u014303647/article/details/37584175