为什么WA了qwq
查看原帖
为什么WA了qwq
199459
Masna_Kimoyo楼主2022/3/13 17:06

还带一个附加疑问

为什么题目给的n范围是100,但是我开了100却挂了

主要疑问

样例都过了,结果评测一个点都没过

思路应该都一样

code:

#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
const int INF=2147483647;
const int N=10500,M=1e4+5;
int head[N],inmin[N],id[N],pre[N],top[N];
int root,n,m,ans,cnt,tot;
struct node{
    int from,to,dis,next;
}Edge[N];
inline int read(){
    int x=0;
    bool w=0;
    char c=getchar();
    while(!isdigit(c))  w|=c=='-',c=getchar();
    while(isdigit(c))   x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return w?-x:x;
}
inline void print(int x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar('0'+x%10);
}
inline void add(int u,int v,int w){
    Edge[++tot].to=v;
    Edge[tot].from=u;
    Edge[tot].dis=w;
    Edge[tot].next=head[u];
    head[u]=tot;
}
inline int zhuliu(){
    while(1){
    	for(register int i=1;i<=n;++i)  inmin[i]=INF,id[i]=top[i]=0;
    	for(register int i=1;i<=m;++i){
            int u=Edge[i].from,v=Edge[i].to,w=Edge[i].dis;
            if(u!=v && w<inmin[v])
            inmin[v]=w,pre[v]=u;
        }
//        cout<<"in:";for(register int i=1;i<=n;++i)
//        	cout<<id[i]<<' ';cout<<endl;
//        for(register int i=1;i<=n;++i)
//        	cout<<pre[i]<<' ';cout<<endl;
    	for(register int i=1;i<=m;++i)
        	if(i!=root && inmin[i]==INF)    return -1;        
    	int x=inmin[root]=0;
    	for(register int i=1;i<=n;++i){
        	ans+=inmin[i];
        	for(x=pre[i];x!=root && top[x]!=i && !id[x];x=pre[x])    top[x]=i;
        	if(x!=root && !id[x]){
            	id[x]=++cnt;
            	for(register int v=pre[x];v!=x;v=pre[v])    id[v]=cnt;
        	}
//        	cout<<"Time for:"<<i<<endl;for(register int i=1;i<=n;++i)
//        		cout<<id[i]<<' ';cout<<endl;
//        	for(register int i=1;i<=n;++i)
//        		cout<<pre[i]<<' ';cout<<endl;
    	}
//    	cout<<"out:";for(register int i=1;i<=n;++i)
//        	cout<<id[i]<<' ';cout<<endl;
//        for(register int i=1;i<=n;++i)
//        	cout<<pre[i]<<' ';cout<<endl;
    	if(!cnt)    return ans;
    	for(register int i=1;i<=n;++i)
        	if(!id[i])  id[i]=++cnt;
    	for(register int i=1;i<=m;++i)
        	if((Edge[i].from=id[Edge[i].from])!=(Edge[i].to=id[Edge[i].to]))    Edge[i].dis-=inmin[Edge[i].to];
    	n=cnt,root=id[root],cnt=0;
	}
}  
signed main(){
    n=read(),m=read(),root=read();
    for(register int i=1;i<=m;++i){
        int u=read(),v=read(),w=read();
        add(u,v,w);
    }
//    for(register int i=1;i<=m;++i)
//    	cout<<Edge[i].from<<' '<<Edge[i].to<<' '<<Edge[i].dis<<endl;
    print(zhuliu());
    return 0;
}
2022/3/13 17:06
加载中...