Six Degrees of Cowvin Bacon-POJ2139-最短路(优先队列)

题意:
牛在同一部影片里,则距离为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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值