http://acm.hdu.edu.cn/showproblem.php?pid=1869
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 500
using namespace std;
const int inf=<<; int g[maxn][maxn];
bool vis[maxn][maxn];
int n,m,a,b; int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,false,sizeof(vis));
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
if(i==j) g[i][j]=;
else g[i][j]=inf;
}
}
for(int i=; i<m; i++)
{
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=;
vis[a][b]=vis[b][a]=true;
}
for(int k=; k<n; k++)
{
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
if(g[i][j]>g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
}
}
}
}
bool flag=true;
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
if(g[i][j]>&&!vis[i][j]&&i!=j)
{
flag=false;
break;
}
}
if(!flag) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}