最裸的迪杰斯特拉
这是以后用来安利学弟学妹的
这题要求最长边,所以我们sort之后用ans保留最长边,然后初始化就好了
以下是我手写迪杰斯特拉
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 struct shit{ 5 int in; 6 int to; 7 int v; 8 }e[251000]; 9 int dep[251000],T,back,father[251000],ans,n,a; 10 bool cmp(shit a,shit b) 11 { 12 if(a.v<b.v)return true; 13 else return false; 14 } 15 int get_father(int s) 16 { 17 return father[s]=father[s]==s?s:get_father(father[s]); 18 } 19 void add(int val,int ii,int jj) 20 { 21 e[++back].v=val; 22 e[back].in=ii; 23 e[back].to=jj; 24 } 25 void scan() 26 { 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=n;j++) 30 { 31 scanf("%d",&a); 32 if(i!=j)add(a,i,j); 33 } 34 sort(e+1,e+back+1,cmp); 35 } 36 void work() 37 { 38 int too,inn; 39 for(int i=1;i<=n;i++) 40 father[i]=i; 41 for(int i=1;i<=back;i++) 42 { 43 too=get_father(e[i].to);inn=get_father(e[i].in); 44 if(too!=inn) 45 { 46 if(dep[too]>dep[inn])father[inn]=too; 47 if(dep[too]<dep[inn])father[too]=inn; 48 if(dep[too]==dep[inn]){ 49 father[inn]=too; 50 dep[too]++; 51 } 52 ans=e[i].v; 53 } 54 } 55 } 56 int main() 57 { 58 scanf("%d",&T); 59 while(T--) 60 { 61 scan(); 62 work(); 63 printf("%d\n",ans); 64 back=0; 65 } 66 return 0; 67 }
代码
时间: 2024-10-23 12:38:25