还带一个附加疑问
为什么题目给的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;
}