图论题解----最短路----P1567、P2951、P1807、P2419、P4306

P1576

#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
int n,m,x,y,z,A,B;
bool vis[2010];
vector<pair<int, ld>> g[2010];
ld dis[2010];
struct Node {
	int data;
	ld dis;
	friend bool operator < (Node a, Node b) {
		return a.dis < b.dis;
	}
};
void dijkstra(int s) {
	priority_queue<Node> q;
	dis[s] = 1.0;
	q.push({s, 1.0});
	while (!q.empty()) {
		Node top = q.top();
		q.pop();
		int data = top.data;
		if (vis[data])
			continue;
		vis[data] = 1;
		for (int i = 0; i < g[data].size(); i++) {
			int v = g[data][i].first;
			ld w = g[data][i].second;
			if (dis[data] * w > dis[v]) {
				dis[v] = dis[data] * w;
				q.push({v, dis[v]});
			}
		}
	}
}
int main() {
	memset(dis, -0x3f, sizeof(dis));
	cin>>n>>m;
	for (int i = 1; i <= m; i++) {
		cin>>x>>y>>z;
		g[x].push_back(make_pair(y,1-z*1.0/100));
		g[y].push_back(make_pair(x,1-z*1.0/100));
	}
	cin>>A>>B;
	dijkstra(A);
	printf("%.8Lf",100.0/dis[B]);
}

P2951

#include <bits/stdc++.h>
using namespace std;
int n, m, s = 1, u, v, cnt = 0, minn = 0x3f3f3f3f, dis[50010], x = 1, maxn = 0;
bool vis[50010];
vector<pair<int,int>> g[50010];
struct Node {
	int data, dis;
	friend bool operator < (Node n1, Node n2) {
		return n1.dis > n2.dis;
	}
};
 
void dijkstra() {
	priority_queue<Node> q;
	dis[s] = 0;
	q.push({s, 0});
	while (!q.empty()) {
		int data = q.top().data;
		q.pop();
		if (vis[data])
			continue;
		vis[data] = 1;
		for (int i = 0; i < (int)(g[data].size()); i++) {
			int nv = g[data][i].first;
			if (dis[data] + 1 < dis[nv]) {
				dis[nv] = dis[data] + 1;
				q.push({nv, dis[nv]});
			}
		}
	}
}
 
int main() {
	memset(dis, 0x3f, sizeof(dis));
	cin>>n>>m;
	for (int i = 1; i <= m; i++) {
		scanf("%d%d", &u, &v);
		g[u].push_back(make_pair(v, 1));
		g[v].push_back(make_pair(u, 1));
	}
	dijkstra();
	for (int i = 1; i <= n; i++) {
		if (dis[i] > maxn) {
			x = i;
			maxn = dis[i];
		}
	}
	for (int i = 1; i <= n; i++) {
		if (dis[i] == maxn)
			cnt++;
	}
	cout<<x<<" "<<maxn<<" "<<cnt;
}

P1807

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, s = 1, u, v, w, dis[1600];
bool vis[1600];
vector<pair<ll, ll>> g[1600];
queue<int> q;
void spfa() {
	for (int i = 0; i <= n; i++)
		dis[i] = -0x3f3f3f3f;
	dis[1] = 0;
	q.push(1);
	vis[1] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for (int i = 0; i < g[u].size(); i++) {
			int v = g[u][i].first, w = g[u][i].second;
			if (dis[u] + w > dis[v]) {
				dis[v] = dis[u] + w;
				if (!vis[v]) {
					q.push(v);
					vis[v] = 1;
				}
			}
		}
	}
}
 
int main() {
	cin>>n>>m;
	for (ll i = 1; i <= m; i++) {
		cin>>u>>v>>w;
		g[u].push_back({v, w});
	}
	spfa();
	if (dis[n] == -0x3f3f3f3f)
		cout<<-1;
	else{
        cout<<dis[n];
    }
}

P2419

#include <bits/stdc++.h>
using namespace std;
int n,m,a,b, cnt = 0;
bool dp[110][110];
int main() {
    cin>>n>>m;
    memset(dp, 0, sizeof(dp));
    for (int i=1; i<=m; i++) {
        cin>>a>>b;
        dp[a][b]=1;
    }
    for (int k=1;k<=n;k++){
        for (int i=1;i<=n;i++){
            for (int j=1;j<= n;j++){
                dp[i][j] |= dp[i][k] & dp[k][j];
            }
        }
    }     
    for (int i=1;i<=n;i++){
        int sum = 0;
        for (int j=1;j<=n;j++){
            if (dp[i][j]||dp[j][i]){
                sum++;
            }
        }
        if (sum==n-1){
            cnt++;
        }
    }
    cout<<cnt;
}

P4306

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll cnt = 0;
char c;
bitset<2010> dp[2010];
int main() {
	cin>>n;
	for (int i = 1; i <= n; i++)
		dp[i][i] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
			cin >> c;
			if (c == '1')
				dp[i].set(j);
		}
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++)
			if (dp[i][k])
				dp[i] |= dp[k];
	}
	for (int i = 1; i <= n; i++)
		cnt += dp[i].count();
	cout<<cnt;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值