樱符「完全墨染的樱花」

樱符「完全墨染的樱花」

题面暂时没有[cry]


 

Solution

他给出的图一定是一棵仙人掌。

考虑仙人掌上的一个环,把环上最小的边删除并加到其他边上,这颗仙人掌的最大流不会变。

那么就是一棵树了。

对于树,我们把边按权值从大到小加入,同时维护pipn(i1)就行

复制代码
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 300005
#define mod 998244353
#define ll long long
using namespace std;
int n,m,P,M[maxn],head[maxn],flag[maxn],f[maxn],tot=1,dfn[maxn],low[maxn],sc;
int ins[maxn],zh[maxn],top;
ll ans,s[maxn],sn[maxn];
struct node{
    int u,v,nex,w,fl;
}e[1000006],E[1000006];
void add(int t1,int t2,int t3){
    e[++tot].v=t2;e[tot].u=t1;e[tot].w=t3;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa){
    zh[++top]=fa;dfn[k]=++sc;ins[k]=1;
    for(int i=head[k];i;i=e[i].nex){
        if(i==(fa^1))continue;
        if(!dfn[e[i].v]){
            dfs(e[i].v,i);
        }
        else if(ins[e[i].v]){
            int Min=e[i].w,pl=i;
            for(int j=top;j>=0;j--){
                int x=zh[j];if(e[x].w<Min)Min=e[x].w,pl=x;
                if(e[x].u==e[i].v)break;
            }
            E[pl/2].fl=1;E[i/2].w+=Min;
            for(int j=top;j>=0;j--){
                int x=zh[j];E[x/2].w+=Min;
                if(e[x].u==e[i].v)break;
            }
        }
    }
    top--;ins[k]=0;
}
bool cmp(node A,node B){
    return A.w>B.w;
}
int getf(int k){return f[k]==k?k:f[k]=getf(f[k]);}
ll work(ll a,ll num){
    ll A=1;for(;num;num>>=1,a=a*a%mod)if(num&1)A=A*a%mod;return A;
}
int main(){
    cin>>n>>m>>P;
    for(int i=1,t1,t2,t3;i<=m;i++){
        scanf("%d%d%d",&t1,&t2,&t3);
        add(t1,t2,t3);add(t2,t1,t3);
        E[i]=(node){t1,t2,0,t3,0};
    }
    dfs(1,0);
    sort(E+1,E+m+1,cmp);
    for(int i=1;i<=n;i++)f[i]=i,s[i]=work(P,i),sn[i]=work(P,1LL*(i-1)*(n));
    for(int i=1;i<=m;i++){
        if(E[i].fl)continue;
        int t1=E[i].u,t2=E[i].v;
        int f1=getf(t1),f2=getf(t2);
        ans=ans+1LL*E[i].w*((sn[f1]*s[f2]%mod+sn[f2]*s[f1]%mod)%mod)%mod;
        ans%=mod;
        f[f1]=f2;(s[f2]+=s[f1])%=mod;(sn[f2]+=sn[f1])%=mod;
    }
    cout<<ans<<endl;
    return 0;
}
复制代码

 

posted @   liankewei123456  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示