Diff
checker
Testo
Testo
Immagini
Documenti
Excel
Cartelle
Legal
Enterprise
Applicazione per desktop
Prezzi
Accedi
Scarica Diffchecker Desktop
Confronta il testo
Trova la differenza tra due file di testo
Strumenti
Cronologia
Editor live
Nascondi spazi bianchi
Comprimi invariate
Senza a capo
Layout
Diviso
Unificato
Livello di dettaglio
Intelligente
Parola
Carattere
Stili testo
Modifica aspetto
Evidenziazione sintassi
Scegli sintassi
Ignora
Trasforma testo
Vai alla prima modifica
Modifica input
Diffchecker Desktop
Il modo più sicuro per usare Diffchecker. Ottieni l'app Diffchecker Desktop: i tuoi diff non lasciano mai il tuo computer!
Ottieni Desktop
Untitled diff
Creato
9 anni fa
Il diff non scade mai
Eliminare
Esporta
Condividere
Spiegare
114 rimozioni
Linee
Totale
Rimosso
Caratteri
Totale
Rimosso
Per continuare a utilizzare questa funzione, aggiorna a
Diff
checker
Pro
Visualizza prezzi
140 linee
Copia tutti
122 aggiunte
Linee
Totale
Aggiunto
Caratteri
Totale
Aggiunto
Per continuare a utilizzare questa funzione, aggiorna a
Diff
checker
Pro
Visualizza prezzi
145 linee
Copia tutti
Copia
Copiato
Copia
Copiato
#include<
cstdio>
#include<
bits/stdc++.h>
#include<cstring>
using namespace std;
#include<algorithm>
const int maxn= 600100;
#include<queue>
#include<vector>
#include<map>
#include<set>
#define maxn 100009
using namespace std;
using namespace std;
Copia
Copiato
Copia
Copiato
int a[maxn], b[maxn], c[maxn], q[maxn];
typedef struct
typedef struct
{
{
Copia
Copiato
Copia
Copiato
int l,r;
int l,r;
}node
;
}node
1
;
node
seg[maxn];
node
1
seg[maxn];
typedef struct
typedef struct
{
{
Copia
Copiato
Copia
Copiato
int u,v,w,id;
int u,v,w,id;
}node
1
;
}node
2
;
node
1
edge[maxn];
node
2
edge[maxn];
bool cmp(node
1
x,node
1
y)
bool cmp(node
2
x,node
2
y)
{
{
Copia
Copiato
Copia
Copiato
return x.w<y.w;
return x.w<y.w;
}
}
int p[maxn];
int p[maxn];
int findset(int x)
int findset(int x)
{
{
Copia
Copiato
Copia
Copiato
return x==p[x]?x:p[x]=findset(p[x]);
return x==p[x]?x:p[x]=findset(p[x]);
}
}
void unionset(int x,int y)
void unionset(int x,int y)
{
{
p[findset(x)]=findset(y);
p[findset(x)]=findset(y);
}
}
int vis[maxn];
int vis[maxn];
bool wa[maxn];
bool wa[maxn];
set<int>st;
set<int>st;
struct Edge
struct Edge
{
{
Copia
Copiato
Copia
Copiato
int to,id;
int to,id;
};
};
vector<Edge>G[maxn];
vector<Edge>G[maxn];
Copia
Copiato
Copia
Copiato
int time;
int dfn[maxn],low[maxn];
int type[maxn];
int type[maxn];
Copia
Copiato
Copia
Copiato
map<
long long,
int>mp;
map<
int,
int>mp;
void dfs(int cur,int fa)
vector< vector<int> > V[maxn];
{
vector<int>tmp[maxn], cr;
vis[cur]=1;
vector<int>buf;
dfn[cur]=low[cur]=++time;
bool NO[maxn];
for(int i=0;i<G[cur].size();i++)
{
int fdset(int x){
int j=G[cur][i].to;
return q[x] == x ? x : q[x] = fdset(q[x]);
if(j!=fa&&vis[j]==1)
low[cur]=min(low[cur],dfn[j]);
if(!vis[j])
{
dfs(j,cur);
low[cur]=min(low[cur],low[j]);
if(low[j]>dfn[cur]&&type[G[cur][i].id]==0)
{
type[G[cur][i].id]=3;
}
}
Copia
Copiato
Copia
Copiato
void unset(int x, int y){
q[fdset(x)] = fdset(y);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
void doit(vector <int> &G){
cr.clear();
int lb = G[0];
for(int j = 1; j < (int)G.size(); j++){
int u = a[G[j]], v = b[G[j]];
u = findset(u);v = findset(v);
if(fdset(u) == fdset(v)){
NO[lb] = 1;
Copia
Copiato
Copia
Copiato
}
}
vis[cur]=2;
unset(u, v);
cr.push_back(u);cr.push_back(v);
if(NO[lb])break;
}
for(auto x: cr)q[x] = x;
}
void check(int x){
for(int i = 0; i < (int)V[x].size(); i++){
doit(V[x][i]);
}
}
}
Copia
Copiato
Copia
Copiato
int main()
int main()
{
{
Copia
Copiato
Copia
Copiato
int n,m;
int n,m;
scanf("%d%d",&n,&m);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
{
p[i]=i;
p[i]=i;
q[i] = i;
}
for(int i=0;i<m;i++)
for(int i=0;i<m;i++)
{
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
Copia
Copiato
Copia
Copiato
a[i+1] = edge[i].u;
b[i+1] = edge[i].v;
c[i+1] = edge[i].w;
Copia
Copiato
Copia
Copiato
edge[i].id=i+1;
edge[i].id=i+1;
}
}
sort(edge,edge+m,cmp);
sort(edge,edge+m,cmp);
int cur=0,tot=0;
int cur=0,tot=0;
while(cur<m)
while(cur<m)
{
{
seg[tot].l=cur;
seg[tot].l=cur;
while(cur+1<m&&edge[cur].w==edge[cur+1].w)
while(cur+1<m&&edge[cur].w==edge[cur+1].w)
cur++;
cur++;
seg[tot].r=cur;
seg[tot].r=cur;
Copia
Copiato
Copia
Copiato
mp[edge[cur].w] = tot;
Copia
Copiato
Copia
Copiato
cur++;tot++;
cur++;tot++;
}
}
Copia
Copiato
Copia
Copiato
int q;
scanf("%d", &q);
for(int i = 1; i <= q; i++){
buf.clear();buf.push_back(i);
cr.clear();
int num;
scanf("%d", &num);
for(int j = 0; j < num; j++){
int x;
scanf("%d", &x);
int w = mp[c[x]];
if((int)tmp[w].size() == 0){
tmp[w].push_back(i);
tmp[w].push_back(x);
cr.push_back(w);
}
else{
tmp[w].push_back(x);
}
buf.push_back(x);
}
for(auto x: cr){
V[x].push_back(tmp[x]);
tmp[x].clear();
}
doit(buf);
}
Copia
Copiato
Copia
Copiato
for(int i=0;i<tot;i++)
for(int i=0;i<tot;i++)
{
{
st.clear();mp.clear(
);
check(i
);
for(int j=seg[i].l;j<=seg[i].r;j++)
for(int j = seg[i].l; j <= seg[i].r; j++){
{
unionset(edge[j].u, edge[j].v);
Edge e;
int x=findset(edge[j].v);
int y=findset(edge[j].u);
if(x==y)
{
type[edge[j].id]=1;continue;
}
else
{
if(x>y)swap(x,y);
long long num=(long long)x*maxn+y;
if(!mp[num]){
mp[num]=edge[j].id;
e.to=y;e.id=edge[j].id;
G[x].push_back(e);
st.insert(x);
e.to=x;
G[y].push_back(e);
st.insert(y);}
else
{
type[edge[j].id]=2;
type[mp[num]]=2;
}
}
}
}
}
set<int>::iterator it;
for(int
i = 1; i <= q; i
++)
time=0;
for(it=st.begin();it!=st.end();++it)
{
if(!vis[*it])dfs(*it,-1);
}
for(int
j=seg[i].l;j<=seg[i].r;j
++)
{
{
if(
type[edge[j].id]==0)
if(
NO[i]){
type[edge[j].id]=2;
puts("NO"
);
unionset(edge[j].u,edge[j].v
);
}
}
for(it=st.begin();it!=st.end();++it)
else{
{vis[*it]=0;G[*it].clear();}
puts("YES");
}
}
Copia
Copiato
Copia
Copiato
for(int i=1;i<=m;i++)
{
if(type[i]==1)printf("none\n");
else if(type[i]==2)printf("at least one\n");
else if(type[i]==3)printf("any\n");
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
return 0;
}
}
Diff salvati
Testo originale
Apri file
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<map> #include<set> #define maxn 100009 using namespace std; typedef struct { int l,r; }node; node seg[maxn]; typedef struct { int u,v,w,id; }node1; node1 edge[maxn]; bool cmp(node1 x,node1 y) { return x.w<y.w; } int p[maxn]; int findset(int x) { return x==p[x]?x:p[x]=findset(p[x]); } void unionset(int x,int y) { p[findset(x)]=findset(y); } int vis[maxn]; bool wa[maxn]; set<int>st; struct Edge { int to,id; }; vector<Edge>G[maxn]; int time; int dfn[maxn],low[maxn]; int type[maxn]; map<long long,int>mp; void dfs(int cur,int fa) { vis[cur]=1; dfn[cur]=low[cur]=++time; for(int i=0;i<G[cur].size();i++) { int j=G[cur][i].to; if(j!=fa&&vis[j]==1) low[cur]=min(low[cur],dfn[j]); if(!vis[j]) { dfs(j,cur); low[cur]=min(low[cur],low[j]); if(low[j]>dfn[cur]&&type[G[cur][i].id]==0) { type[G[cur][i].id]=3; } } } vis[cur]=2; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i]=i; for(int i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); edge[i].id=i+1; } sort(edge,edge+m,cmp); int cur=0,tot=0; while(cur<m) { seg[tot].l=cur; while(cur+1<m&&edge[cur].w==edge[cur+1].w) cur++; seg[tot].r=cur; cur++;tot++; } for(int i=0;i<tot;i++) { st.clear();mp.clear(); for(int j=seg[i].l;j<=seg[i].r;j++) { Edge e; int x=findset(edge[j].v); int y=findset(edge[j].u); if(x==y) { type[edge[j].id]=1;continue; } else { if(x>y)swap(x,y); long long num=(long long)x*maxn+y; if(!mp[num]){ mp[num]=edge[j].id; e.to=y;e.id=edge[j].id; G[x].push_back(e); st.insert(x); e.to=x; G[y].push_back(e); st.insert(y);} else { type[edge[j].id]=2; type[mp[num]]=2; } } } set<int>::iterator it; time=0; for(it=st.begin();it!=st.end();++it) { if(!vis[*it])dfs(*it,-1); } for(int j=seg[i].l;j<=seg[i].r;j++) { if(type[edge[j].id]==0) type[edge[j].id]=2; unionset(edge[j].u,edge[j].v); } for(it=st.begin();it!=st.end();++it) {vis[*it]=0;G[*it].clear();} } for(int i=1;i<=m;i++) { if(type[i]==1)printf("none\n"); else if(type[i]==2)printf("at least one\n"); else if(type[i]==3)printf("any\n"); } }
Testo modificato
Apri file
#include<bits/stdc++.h> using namespace std; const int maxn= 600100; using namespace std; int a[maxn], b[maxn], c[maxn], q[maxn]; typedef struct { int l,r; }node1; node1 seg[maxn]; typedef struct { int u,v,w,id; }node2; node2 edge[maxn]; bool cmp(node2 x,node2 y) { return x.w<y.w; } int p[maxn]; int findset(int x) { return x==p[x]?x:p[x]=findset(p[x]); } void unionset(int x,int y) { p[findset(x)]=findset(y); } int vis[maxn]; bool wa[maxn]; set<int>st; struct Edge { int to,id; }; vector<Edge>G[maxn]; int type[maxn]; map<int, int>mp; vector< vector<int> > V[maxn]; vector<int>tmp[maxn], cr; vector<int>buf; bool NO[maxn]; int fdset(int x){ return q[x] == x ? x : q[x] = fdset(q[x]); } void unset(int x, int y){ q[fdset(x)] = fdset(y); } void doit(vector <int> &G){ cr.clear(); int lb = G[0]; for(int j = 1; j < (int)G.size(); j++){ int u = a[G[j]], v = b[G[j]]; u = findset(u);v = findset(v); if(fdset(u) == fdset(v)){ NO[lb] = 1; } unset(u, v); cr.push_back(u);cr.push_back(v); if(NO[lb])break; } for(auto x: cr)q[x] = x; } void check(int x){ for(int i = 0; i < (int)V[x].size(); i++){ doit(V[x][i]); } } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ p[i]=i;q[i] = i; } for(int i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); a[i+1] = edge[i].u; b[i+1] = edge[i].v; c[i+1] = edge[i].w; edge[i].id=i+1; } sort(edge,edge+m,cmp); int cur=0,tot=0; while(cur<m) { seg[tot].l=cur; while(cur+1<m&&edge[cur].w==edge[cur+1].w) cur++; seg[tot].r=cur; mp[edge[cur].w] = tot; cur++;tot++; } int q; scanf("%d", &q); for(int i = 1; i <= q; i++){ buf.clear();buf.push_back(i); cr.clear(); int num; scanf("%d", &num); for(int j = 0; j < num; j++){ int x; scanf("%d", &x); int w = mp[c[x]]; if((int)tmp[w].size() == 0){ tmp[w].push_back(i); tmp[w].push_back(x); cr.push_back(w); } else{ tmp[w].push_back(x); } buf.push_back(x); } for(auto x: cr){ V[x].push_back(tmp[x]); tmp[x].clear(); } doit(buf); } for(int i=0;i<tot;i++) { check(i); for(int j = seg[i].l; j <= seg[i].r; j++){ unionset(edge[j].u, edge[j].v); } } for(int i = 1; i <= q; i++) { if(NO[i]){ puts("NO"); } else{ puts("YES"); } } return 0; }
Trovare la differenza