样例一直输出11,然后试着交了一发居然过了
谁告诉我为什么。
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m,cnt,head[1000005],nxt[5000005],to[5000005],a[1000005],vis[1000005],dis[1000005];
void add(int u,int v,int w){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
a[cnt]=w;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
add(i,i+n,-a[i]);
add(i+n,i+2*n,a[i]);
}
for(int i=1;i<=m;i++){
int u,v,op;
cin>>u>>v>>op;
if(op==1){
add(u,v,0);
add(u+n,v+n,0);
add(u+2*n,v+2*n,0);
}else{
add(u,v,0);add(v,u,0);
add(u+n,v+n,0);
add(u+2*n,v+2*n,0);
add(v+n,u+n,0);
add(v+2*n,u+2*n,0);
}
}
for(int i=1;i<=3*n;i++)dis[i]=-2147483647;
queue<int> q;
q.push(1);
vis[1]=1;
dis[1]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(dis[v]<dis[u]+a[i]){
dis[v]=dis[u]+a[i];
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
//cout<<dis[2*n];
cout<<dis[3*n];
return 0;
}