题意理解:这道题就是给出了一个图,然后又很多次查询,查询中给出了一些点,如果这些点任意两点之间的最短路径,经过的点都算上。能够凑满整个图那就是yes,否则就是no。
解题思路:我们就是要找最短路,找到任意两点之间的最短路,因为点最多有40个,我们可以用一个 long long 来存看是否经过了所有的点。
Description
Input
Output
Sample Input
5 2 3 1 3 4 1 2 5 2 5 3 4 6 1 2 3 4 5 1 2 5 2 4 1 3 4 1 4 5 3 4 5
Sample Output
yes yes no yes yes no
#include
#include
#include
using namespace std;
#define inf 0x3fffffff
int map_[100][100];
int book2[100];
long long f[100][100];
int main()
{
int n;
scanf("%d",&n);
memset(f,0,sizeof(f));
for(int i=1;i<50;i++)
{
for(int j=1;j<50;j++)
{
if(i==j)
{
map_[i][j]=0;
}
else
{
map_[i][j]=inf;
}
}
}
for(int i=1;i<=n;i++)
{
while(1)
{
int x;
scanf("%d",&x);
map_[i][x]=1;
char c=getchar();
if(c=='\n')
break;
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map_[i][j]>map_[i][k]+map_[k][j])
{
map_[i][j]=map_[i][k]+map_[k][j];
}
}
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map_[i][j]==map_[i][k]+map_[k][j])
{
f[i][j]|=((long long)1<<(long long)(k-1));
}
}
}
}
int q;
scanf("%d",&q);
for(int i=0;i>1;
}
if(cnt==n)
{
printf("yes\n");;
}
else
{
printf("no\n");
}
}
}