NEUQ-ACM 必做题 week8

B3647 【模板】Floyd

#include <stdio.h>
#define inf 0x3f3f3f3f
int map[1000][1000];
int main()
{
    int k,i,j,n,m;
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            if(i==j)
                map[i][j]=0;
            else
                map[i][j]=inf;
    int a,b,c;
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        map[a][b]=c;
		map[b][a]=c;
    }
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                if(map[i][j]>map[i][k]+map[k][j] )
                    map[i][j]=map[i][k]+map[k][j];

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }
    return 0;
}

P4779 【模板】单源最短路径(标准版)

#include <bits/stdc++.h> 
using namespace std;
const int N = 100005;
const int M = 200005;
struct edge {
	int v;
	int w;
	int next;
} e[M];
int n, m, s, cnt;
int head[N], vis[N], dis[N];

struct node {
	int id;
	int w;
	const bool operator < (const node&a) const{
		return a.w < w;
	}
};

inline void read(int &x) { 
	char ch = getchar(); x = 0;
	for (; !isdigit(ch); ch = getchar()) ;
	for (;  isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
}

void add(int u, int v, int w) {
	cnt++;
	e[cnt].v = v;
	e[cnt].w = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}
priority_queue <node> q;
void Dijkstra(int s) {
	for (int i = 1; i <= n; i++) 
		dis[i] = 1e9 + 1;
	dis[s] = 0;
	q.push((node){s, 0});
	while (!q.empty()) {
		node fro = q.top();
		q.pop();
		if (vis[fro.id]) continue;
		vis[fro.id] = 1;
		for (int i = head[fro.id]; i != -1; i = e[i].next) {
			int nv = e[i].v;
			if (dis[nv] > dis[fro.id] + e[i].w) {
				dis[nv] = dis[fro.id] + e[i].w;
				q.push((node){nv, dis[nv]});
			}
		}
	}
	return ;
}

int main() {
	read(n), read(m), read(s);
	memset(head, -1, sizeof(head));
	for (int u, v, w, i = 0; i < m; i++) {
		read(u), read(v), read(w);
		add(u, v, w);
	}
	Dijkstra(s);
	for (int i = 1; i <= n; i++) 
		printf ("%d ", dis[i]);
	puts("");
	return 0;
}

P2661 [NOIP2015 提高组] 信息传递

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define MAXN 200005
#define INF 0x7FFFFFFF
struct Edges
{
    int u, v, id;
};
struct Node
{
    int indegree, outdegree;
};
Node V[MAXN];
int v, ans;
vector<Edges> G[MAXN];
bool vis[MAXN];
void DFS(int v, int cnt)
{
    unsigned int i;
    if (vis[v])
    {
        ans = min(ans, cnt);
        return;
    }
    vis[v] = true;
    for (i = 0; i < G[v].size(); i++)
        DFS(G[v][i].v, cnt + 1);
}
int main()
{
    int i, x;
    memset(V, 0, sizeof(V));
    memset(vis, 0, sizeof(vis));
    cin >> v;
    for (i = 1; i <= v; i++)
    {
        cin >> x;
        G[i].push_back((Edges){i, x, i}); 
        V[i].outdegree++;                 
        V[x].indegree++;                 
    }
    for (i = 1; i <= v; i++)
    {
        x = i;
        while (!V[x].indegree && !vis[x])
        {
            vis[x] = true;
            x = G[x][0].v;
            V[x].indegree--;
        }
    }
    ans = INF;
    for (i = 1; i <= v; i++)
        if (!vis[i])
            DFS(i, 0);
    cout << ans << endl;
    return 0;
}

P1144 最短路计数

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1e6+5, maxm = 2e6+5;
const int mod = 100003;
vector<int> g[maxn]; 
int dist[maxn]; 
bool vis[maxn]; 
int cnt[maxn];
int n, m; 
 
void bfs(){
    memset(dist, 0x3f3f3f3f,sizeof(dist));
    memset(vis, false, sizeof(vis));
    queue<int> q;
    dist[1] = 0;
    cnt[1] = 1;
    q.push(1);
    while(q.size()){
        int u = q.front(); q.pop();
        if(vis[u]) continue; 
        vis[u] = true;
        for(int v : g[u]){
            if(!vis[v]){
                if(dist[v] > dist[u] + 1){
                    dist[v] = dist[u] + 1;
                    cnt[v]=cnt[u];
                    cnt[v] %= mod;
                    q.push(v);
                }
                else if(dist[v] == dist[u] + 1){

                    cnt[v] += cnt[u];
                    cnt[v] %= mod;
                }
            }
        }
    }
}
 
int main(){
    cin >> n >> m;
    for(int i=0; i<m; i++){
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    bfs();
    for(int i=1; i<=n; i++){
        cout << cnt[i] << endl;
    }
    return 0;
}

 P8794 [蓝桥杯 2022 国 A] 环境治理

#include <bits/stdc++.h>

#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {
	inline int read() {
		register int x = 0, f = 1;
		register char c = getchar();
		while (c < '0' || c > '9') {
			if(c == '-') f = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
		return x * f;
	}
	inline void write(int x) {
		if(x < 0) putchar('-'), x = -x;
		if(x > 9) write(x / 10);
		putchar(x % 10 + '0');
		return;
	}
}
using namespace fastIO;
int w[105][105];
int ww[105][105];
int minn[105][105];
int n, q;
int check(int day) {
	int ans = 0;
	for(int i = 0; i < n; i ++) {
		for(int j = 0; j < n; j ++) {
			ww[i][j] = w[i][j];
		}
	}		
	for(int i = 0; i < n; i ++) {
		int val = day / n + (day % n >= i + 1 ? 1 : 0);
		for(int j = 0; j < n; j ++) {
			ww[i][j] -= val, ww[j][i] -= val;
		}	
	}
	for(int i = 0; i < n; i ++) {
		for (int j = 0; j < n; j ++) {
			ww[i][j] = max(minn[i][j], ww[i][j]);
		}
	}		
	for(int k = 0; k < n; k ++) {
		for (int i = 0; i < n; i ++) {
			for (int j = 0; j < n; j ++) {
				ww[i][j] = min(ww[i][j], ww[i][k] + ww[k][j]);
			}
		}
	}		
	for(int i = 0; i < n; i ++) {
		for(int j = 0; j < n; j ++) {
			ans += ww[i][j];
		}
	}
	return ans;
}
int main() {
	n = read(), q = read();
	for(int i = 0; i < n; i ++) {
		for(int j = 0; j < n; j ++) {
			w[i][j] = read();
		}
	}		
	for(int i = 0; i < n; i ++) {
		for(int j = 0; j < n; j ++) {
			minn[i][j] = read();
		}
	}	
	int l = 0, r = 100000 * n, ans = -1;
	while(l <= r) {
		int mid = l + r >> 1;
		if(check(mid) <= q) {
			r = mid - 1;
			ans = mid;
		} 
		else {
			l = mid + 1;
		}
	}
	write(ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值