每个点能达到的点数为n-1,那么这个点就满足条件。
此题目有环因此设置一个maze[1005][1005]判断之前a到b是否已经基数,也可不设判断tt[a]+tt[b] >= n - 1;
此题与poj3660相似poj3360(vj上的)
#include<iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
#include <set>
#include <cstdio>
using namespace std;
const int INF = 999999999;
int n;
int m;
int dis[1005];
bool visited[1005];
bool maze[1005][1005];
vector<int> g[1005];
int tt[1005];
int ans = 0;
void dijkatrla(int s){
for(int i = 0;i < n;i++){
dis[i] = INF;
visited[i] = 0;
}
queue<int> Q;
Q.push(s);
visited[s] = 1;
dis[s] = 0;
while(!Q.empty()){
int top = Q.front();
Q.pop();
visited[s] = 1;
for(int i = 0;i < g[top].size();i++){
int id = g[top][i];
if(dis[id] > dis[top] + 1){
dis[id] = dis[top] + 1;
if(!visited[id]){
visited[id] = 1;
Q.push(id);
}
}
}
}
for(int i = 0;i < n;i++){
// cout << dis[i] << " ";
if(i == s) continue;
if(dis[i] != INF){
if(maze[i][s] == 0){
tt[i]++;
tt[s]++;
maze[i][s] = 1;
maze[s][i] = 1;
}
}
}
//cout << endl;
//ans++;
}
int main(){
ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 0;i < m;i++){
int a,b;
cin >> a >> b;
a--;b--;
g[a].push_back(b);
}
for(int i = 0;i < n;i++){
dijkatrla(i);
}
for(int i = 0;i < n;i++){
//cout << tt[i] << " ";
if(tt[i] == n - 1) ans++;
}
//cout << endl;
//cout << endl;
cout << ans << endl;
}
方法二判断点数>= n-1的情况,之前没考虑到0分,加一个>直接100,太可惜啦。题目
#include<iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
#include <set>
#include <cstdio>
using namespace std;
const int INF = 999999999;
int n;
int m;
int dis[1005];
bool visited[1005];
//bool maze[1005][1005];
vector<int> g[1005];
int tt[1005];
int ans = 0;
void dijkatrla(int s){
for(int i = 0;i < n;i++){
dis[i] = INF;
visited[i] = 0;
}
queue<int> Q;
Q.push(s);
visited[s] = 1;
dis[s] = 0;
while(!Q.empty()){
int top = Q.front();
Q.pop();
visited[s] = 1;
for(int i = 0;i < g[top].size();i++){
int id = g[top][i];
if(dis[id] > dis[top] + 1){
dis[id] = dis[top] + 1;
if(!visited[id]){
visited[id] = 1;
Q.push(id);
}
}
}
}
for(int i = 0;i < n;i++){
// cout << dis[i] << " ";
if(i == s) continue;
if(dis[i] != INF){
//if(maze[i][s] == 0){
tt[i]++;
tt[s]++;
// maze[i][s] = 1;
//maze[s][i] = 1;
//}
}
}
//cout << endl;
//ans++;
}
int main(){
ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 0;i < m;i++){
int a,b;
cin >> a >> b;
a--;b--;
g[a].push_back(b);
}
for(int i = 0;i < n;i++){
dijkatrla(i);
}
for(int i = 0;i < n;i++){
//cout << tt[i] << " ";
if(tt[i] >= n - 1) ans++;
}
//cout << endl;
//cout << endl;
cout << ans << endl;
}