http://acm.hdu.edu.cn/showproblem.php?pid=1869
题意:中文题,如果某点到任意一点的最短路大于7,则说明结论不成立。
思路:水题,不过还是熟悉了对三种算法的操作。首先是floyd,由于是多源最短路算法,所以最后只要遍历找路程即可。而且时间要远快于后面两种。
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
typedef long long LL;
const int N = 1000;
const int INF = 0x3f3f3f3f;
int dis[N], G[N][N], n;
void floyd()
{
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
G[i][j] = min(G[i][j], G[i][k]+G[k][j]);
int flag = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(G[i][j] > 7) flag = 0;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
int main()
{
// freopen("in.txt", "r", stdin);
int m, s, e;
while(~scanf("%d%d", &n, &m))
{
if(n == 0 && m == 0) break;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(i == j) G[i][j] = 0;
else G[i][j] = INF;
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &s, &e);
G[s][e] = G[e][s] = 1;
}
floyd();
}
return 0;
}
而dijkstra和spfa都是单源的,所以需要把所有点当成顶点遍历一次得到。
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
typedef long long LL;
const int N = 1000;
const int INF = 0x3f3f3f3f;
int dis[N], G[N][N], n;
bool vis[N];
void dijkstra(int s)
{
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++)
dis[i] = G[s][i];
dis[s] = 0;
for(int i = 0; i < n; i++)
{
int k = -1;
for(int j = 0; j < n; j++)
{
if(!vis[j] && (k==-1 || dis[j]<dis[k]))
k = j;
}
if(k == -1) break;//已经遍历所有的点
vis[k] = true;
for(int j = 0; j < n; j++)
{
if(!vis[j]) dis[j] = min(dis[j], dis[k]+G[k][j]);
}
}
}
void spfa(int s)
{
memset(vis, 0, sizeof(vis));
queue<int>que;
for(int i = 0; i < n; i++)
dis[i] = INF;//初值记得赋无穷,而不是G数组中的值!
dis[s] = 0;
vis[s] = true;
que.push(s);
while(!que.empty())
{
int now = que.front();
que.pop();
vis[now] = false;//记得还原!!
for(int i = 0; i < n; i++)
{
if(dis[now]+G[now][i]<dis[i])
{
dis[i] = dis[now]+G[now][i];
if(!vis[i])
{
vis[i] = true;
que.push(i);
}
}
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int m, s, e;
while(~scanf("%d%d", &n, &m))
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(i == j) G[i][j] = 0;
else G[i][j] = INF;
}
for(int i = 0; i < m; i++)
{
scanf("%d%d", &s, &e);
G[s][e] = G[e][s] = 1;
}
int flag = 1;
for(int i = 0; i < n; i++)
{
// dijkstra(i);
spfa(i);
for(int j = 0; j < n; j++)
{
if(dis[j] > 7) flag = 0;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}