2022/5/3

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022/5/3相关的知识,希望对你有一定的参考价值。

P1550 [USACO08OCT]Watering Hole G
最小生成树的思维题。类似引入一个超级源点,但本体图中本就有n+1个点,要去思考多出来那个点的意义。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod =1e9+7;
struct node

    int x,y,w;
e[100005];
int n,w[305],cnt,p,ans,f[305],mi=0x3f;
void add(int i,int j,int ww)

    e[++cnt].x=i;
    e[cnt].y=j;
    e[cnt].w=ww;

bool cmp(node e1,node e2)

    return e1.w<e2.w;

int r_find(int r)

    if(r==f[r])
        return f[r];
    f[r]=r_find(f[r]);
    return f[r];

int main()

    cin>>n;
    for(int i=1;i<=n;i++)
    
        cin>>w[i];
        add(n+1,i,w[i]);
    
    for(int i=1;i<=n;i++)
    
        for(int j=1;j<=n;j++)
        
            int x;cin>>x;
            if(j<=i) continue;
            add(i,j,x);
        
    
    sort(e+1,e+cnt+1,cmp);
    for(int i=1;i<=n+1;i++)
        f[i]=i;
    for(int i=1;i<=cnt;i++)
    
        int fx=r_find(e[i].x),fy=r_find(e[i].y);
        if(fx==fy)
            continue;
        f[fx]=fy;
        p++;
        ans+=e[i].w;
        if(p==n) break;
    
    cout<<ans<<endl;
	return 0;


P1137 旅行计划
拓扑排序+简单dp city[v]=max(city[v],city[k]+1)
经过的点入读及时减1.

#include <bits/stdc++.h>

using namespace std;
const int maxn=2e5+5;
int n,m,indgr[maxn],city[maxn],head[maxn],cnt;
struct node

    int to,nxt;
g[maxn];
queue<int>q;
void add_edge(int u,int v)

    g[++cnt].to=v;
    g[cnt].nxt=head[u];
    head[u]=cnt;

void topsort()

    for(int i=1;i<=n;i++)
    
       if(indgr[i]==0)
       
           city[i]=1;q.push(i);
       
    
    while(!q.empty())
    
        int k=q.front(); //取得入度为0的结点
        q.pop();
        for(int i=head[k];i;i=g[i].nxt) //i表示与邻接点相连的变
        
            int v=g[i].to; //通过这个点找到的下一个点
            indgr[v]--;   //入度减去1
            city[v]=max(city[v],city[k]+1);  //dp思想
            if(indgr[v]==0)  //若为0加入队列
            
                q.push(v);
            
        
    

int main()

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    
        head[i]=-1;city[i]=1;
    
    for(int i=1;i<=m;i++)
    
        int a,b;
        scanf("%d%d",&a,&b);
        add_edge(a,b);
        indgr[b]++;
    
    topsort();
    for(int i=1;i<=n;i++)
    
        cout<<city[i]<<endl;
    
    return 0;

以上是关于2022/5/3的主要内容,如果未能解决你的问题,请参考以下文章

GraphX中Pregel单源点最短路径(转)

hdu-2680 Choose the best route---dijkstra+反向存图或者建立超级源点

python 实现dijkstra算法求解最短路径

网络流

单源点最短路径的Dijkstra算法

如何在 Android 的 Google 地图中显示路线时缩放到源点。