diff --git a/13307130498/assignment12/Arctic Network.cpp b/13307130498/assignment12/Arctic Network.cpp new file mode 100644 index 0000000..117429d --- /dev/null +++ b/13307130498/assignment12/Arctic Network.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +using namespace std; +int D[505][2],f[505]; +int i,j,k,n,s,p; +struct A{ + int x,y; + double w; +}L[250010]; +bool fin(A x,A y){ + return x.w<=y.w; +} +int find(int m){ + if(m==f[m])return m; + return f[m]=find(f[m]); +} +void kru(){ + int done; + double cnt[p]; + for(i=done=0;i0;n--){ + scanf("%d%d",&s,&p); + for(i=0;i +#include +#include +#include +#include +using namespace std; +int i,p,t; +struct A{ + int x,y,w; +}L[250010]; +struct B{ + int y,w; + B(int a,int b){y=a;w=b;} +}; +vector pre[10010]; +int Dist[10010],used[10010]; +long long result = 0; +void dfs(int now){//cout<<"^_^"<>p>>t; + for(Dist[0]=0,i=1;i > s; + s.push(pair(0,0)); + int now,ed; + while(s.empty()==0){ + now=s.top().first; + ed=s.top().second; + s.pop(); + if(ed!=Dist[now])continue; + for(i=0;i(L[i].y,Dist[now]+L[i].w)); + } + else{ + if(Dist[L[i].y]>Dist[now]+L[i].w){ + pre[L[i].y].clear(); + Dist[L[i].y]=Dist[now]+L[i].w; + pre[L[i].y].push_back(B(L[i].x,L[i].w)); + s.push(pair(L[i].y,Dist[now]+L[i].w)); + } + else if(Dist[L[i].y]==Dist[now]+L[i].w){ + pre[L[i].y].push_back(B(L[i].x,L[i].w)); + } + } + } + else if(L[i].y==now){ + if(Dist[L[i].x]==-1){ + Dist[L[i].x]=Dist[now]+L[i].w; + pre[L[i].x].clear(); + pre[L[i].x].push_back(B(L[i].y,L[i].w)); + s.push(pair(L[i].x,Dist[now]+L[i].w)); + } + else{ + if(Dist[L[i].x]>Dist[now]+L[i].w){ + pre[L[i].x].clear(); + Dist[L[i].x]=Dist[now]+L[i].w; + pre[L[i].x].push_back(B(L[i].y,L[i].w)); + s.push(pair(L[i].x,Dist[now]+L[i].w)); + } + else if(Dist[L[i].x]==Dist[now]+L[i].w){ + pre[L[i].x].push_back(B(L[i].y,L[i].w)); + } + } + } + } + } + now = p - 1; + dfs(now); + result*=2; + cout< +#include +using namespace std; +int n,k,cnt; +int f[50005],ran[50005]; +void inti(){ + for(int i=1;i<=n;i++){ + f[i]=i; + ran[i]=0; + } +} +int find(int m){ + if(f[m]==m)return m; + int of = f[m]; + f[m] = find(f[m]); + ran[m]=(ran[m]+ran[of])%3; + return f[m]; +} +void uni(int d,int x,int y){ + int fx=find(x),fy=find(y); + if(fx==fy)return; + f[fx]=fy; + ran[fx]=(ran[y]+d-1-ran[x]+3)%3; +} +bool jud(int d,int x,int y){ + if(x>n||y>n||((x==y)&&(d==2)))return 0; + int fx=find(x),fy=find(y); + if(fx!=fy)return 1; + if(ran[x]==(ran[y]+d-1)%3)return 1; + else return 0; +} +int main(void){ + cin>>n>>k; + int x,y,d; + inti(); + for(cnt=0;k>0;k--){ + scanf("%d%d%d",&d,&x,&y); + if(jud(d,x,y)==0) + cnt++; + else + uni(d,x,y); + } + cout<