Six Degrees of Cowvin Bacon-POJ2139-最短路(優先佇列)
阿新 • • 發佈:2018-12-14
題意:
牛在同一部影片裡,則距離為1,通過1箇中間牛傳遞則是2,然後就想節點之間的距離一樣傳遞。此外該圖是連通圖。然後就是對每頭牛都用Dijikstra跑一遍。所以要用優先佇列優化,否則會TLE。
水題
AC CODE:
#include<iostream>
#include<cstdio>
#include<vector>
#include<bitset>
#include<stack>
#include<set>
#include<queue>
#include<map>
#include<cmath>
#include<string>
#include<cstring>
#include<ctime>
#include<fstream>
#include<cstdlib>
#include<algorithm>
using namespace std;
//#define pii pair<int, int>
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define PER(i,x) for(auto i=x.begin();i!=x.end();i++)
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
typedef long long LL;
const double eps=1.0e-5;
const int maxn=300 + 10;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
int n = 0,m = 0 ;
bool vis[maxn];
int adj[maxn][maxn];
int a[maxn];
int d[maxn];
typedef pair<int, int> pii;
struct cmp{
bool operator()(const pii a,const pii b){
return a.second > b.second;
}
};
void dijikstra(int s){
priority_queue<pii,vector<pii>,cmp > que;
que.push(pii(s,0));
d[s] = 0;//不要忘記設定初始值了
while(!que.empty()){
pii p = que.top();
que.pop();
int u = p.first,v = p.second;
if(d[u] < v || vis[u] == true){
continue;
}
vis[u] = true;
for(int i = 1;i <= n;++i){
if(d[u] + adj[u][i] < d[i] && vis[i] == false){
d[i] = d[u] + adj[u][i];
que.push(pii(i,d[i]));
}
}
}
}
void solve(){
int minv = INF;
per(i,1,n){
fill(d,d+maxn,INF);
fill(vis,vis+maxn,false);
dijikstra(i);
int sum = 0;
per(j,1,n){
sum += d[j];
}
minv = min(minv,sum*100/(n-1));
}
printf("%d\n",minv);
}
int main(){
#ifndef ONLINE_JUDGE
//freopen("a.txt","r",stdin);
#endif
while(~scanf("%d %d",&n,&m)){
fill(adj[0],adj[0]+maxn*maxn,INF);
per(i,1,m){
int num = 0;
scanf("%d",&num);
per(j,1,num){
scanf("%d",&a[j]);
}
per(j,1,num){//建圖
per(k,j+1,num){
adj[a[j]][a[k]] = adj[a[k]][a[j]] = 1;
}
}
}
solve();
}
return 0;
}