一本通1527欧拉回路
1527:【例 1】歐拉回路
時間限制: 1000 ms ??? ??? 內存限制: 262144 KB【題目描述】
原題來自:UOJ #117
有一天一位靈魂畫師畫了一張圖,現在要你找出歐拉回路,即在圖中找一個環使得每條邊都在環上出現恰好一次。
一共兩個子任務:
這張圖是無向圖。(50 分)
這張圖是有向圖。(50 分)
【輸入】
第一行一個整數?t,表示子任務編號。t∈{1,2},如果?t=1?則表示處理無向圖的情況,如果?t=2?則表示處理有向圖的情況。
第二行兩個整數?n,m,表示圖的結點數和邊數。
接下來?m?行中,第?i?行兩個整數?vi,ui?,表示第?i?條邊(從?1?開始編號)。保證?1≤vi,ui≤n。
如果?t=1?則表示?vi?到?ui?有一條無向邊。
如果?t=2?則表示?vi?到?ui?有一條有向邊。
圖中可能有重邊也可能有自環。
【輸出】
如果不可以一筆畫,輸出一行?NO。
否則,輸出一行?YES,接下來一行輸出一組方案。
如果?t=1,輸出?m?個整數?p1,p2,…,pm?。令?e=|pi|,那么?e?表示經過的第?i?條邊的編號。如果?pi為正數表示從?ve?走到?ue?,否則表示從?ue?走到?ve?。
如果?t=2,輸出?m?個整數?p1,p2,…,pm?。其中?pi?表示經過的第?i?條邊的編號。
【輸入樣例】
1 3 3 1 2 2 3 1 3【輸出樣例】
YES 1 2 -3【提示】
樣例輸入 2
2 5 6 2 3 2 5 3 4 1 2 4 2 5 1樣例輸出 2
YES 4 1 3 5 2 6數據范圍與提示:
1≤n≤10^5,0≤m≤2×10^5
?
?
--------------------------放了一大坨概念在下面--------------------------
歐拉回路和歐拉路徑的幾個概念:
歐拉環:圖中經過每條邊一次且僅一次的環;
歐拉路徑:圖中經過每條邊一次且僅一次的路徑;
歐拉圖:有至少一個歐拉環的圖;
半歐拉圖:沒有歐拉環,但有至少一條歐拉路徑的圖。
【無向圖】
一個無向圖是歐拉圖當且僅當該圖是連通的(注意,不考慮圖中度為0的點,因為它們的存在對于圖中是否存在歐拉環、歐拉路徑沒有影響)且所有點的度數都是偶數;一個無向圖是半歐拉圖當且僅當該圖是連通的且有且只有2個點的度數是奇數(此時這兩個點只能作為歐拉路徑的起點和終點);
證明:因為任意一個點,歐拉環(或歐拉路徑)從它這里進去多少次就要出來多少次,故(進去的次數+出來的次數)為偶數,又因為(進去的次數+出來的次數)=該點的度數(根據定義),所以該點的度數為偶數。
【有向圖】
一個有向圖是歐拉圖當且僅當該圖的基圖(將所有有向邊變為無向邊后形成的無向圖,這里同樣不考慮度數為0的點)是連通的且所有點的入度等于出度;一個有向圖是半歐拉圖當且僅當該圖的基圖是連通的且有且只有一個點的入度比出度少1(作為歐拉路徑的起點),有且只有一個點的入度比出度多1(作為終點),其余點的入度等于出度。
證明:與無向圖證明類似,一個點進去多少次就要出來多少次。
?
模板嘛。。。
?
1 /* 2 不懂為什么dfs里的i加個&可以快這么多 3 */ 4 #pragma comment(linker, "/STACK:102400000,102400000") 5 #include <bits/stdc++.h> 6 using namespace std; 7 const int N=100005,M=500005; 8 inline int read() 9 { 10 int s=0,f=0; 11 char ch=' '; 12 while(!isdigit(ch)) 13 { 14 f|=(ch=='-'); 15 ch=getchar(); 16 } 17 while(isdigit(ch)) 18 { 19 s=(s<<3)+(s<<1)+(ch^48); 20 ch=getchar(); 21 } 22 return (f)?(-s):(s); 23 } 24 #define R(x) x=read() 25 inline void write(int x) 26 { 27 if(x<0) 28 { 29 putchar('-'); 30 x=-x; 31 } 32 if(x<10) 33 { 34 putchar(x+'0'); 35 return; 36 } 37 write(x/10); 38 putchar((x%10)+'0'); 39 return; 40 } 41 inline void writeln(int x) 42 { 43 write(x); 44 putchar('\n'); 45 return; 46 } 47 #define W(x) write(x),putchar(' ') 48 #define Wl(x) writeln(x) 49 int n,m,T; 50 int Indeg[N],Outdeg[N],Deg[N]; 51 namespace Oulahuilu 52 { 53 int tot=0,Next[M],to[M],head[N]; 54 bool Arr[M]; 55 inline void add(int x,int y) 56 { 57 Next[++tot]=head[x]; 58 to[tot]=y; 59 head[x]=tot; 60 return; 61 } 62 int Huilu[M],Huilu_cnt=0; 63 inline void Run(int x) 64 { 65 for(int &i=head[x];i;i=Next[i]) if(!Arr[i]) 66 { 67 int oo=i; 68 Arr[i]=1; 69 if(T==1) 70 { 71 (i&1)?(Arr[i+1]=1):(Arr[i-1]=1); 72 } 73 Run(to[i]); 74 Huilu[++Huilu_cnt]=oo; 75 } 76 return; 77 } 78 inline void Output() 79 { 80 int i; 81 for(i=Huilu_cnt;i>=1;i--) 82 { 83 if(T==1) 84 { 85 W(((Huilu[i]&1)?1:-1)*((Huilu[i]+1)/2)); 86 } 87 else 88 { 89 W(Huilu[i]); 90 } 91 } 92 return; 93 } 94 } 95 int main() 96 { 97 // freopen("tour14.in","r",stdin); 98 // freopen("my.out","w",stdout); 99 int i; 100 R(T); 101 R(n); 102 R(m); 103 if(T==1) 104 { 105 106 for(i=1;i<=m;i++) 107 { 108 int x,y; 109 R(x); 110 R(y); 111 Deg[x]++; 112 Deg[y]++; 113 Oulahuilu::add(x,y); 114 Oulahuilu::add(y,x); 115 } 116 for(i=1;i<=n;i++) if(Deg[i]&1) 117 { 118 return 0*puts("NO"); 119 } 120 for(i=1;i<=n;i++) if(Oulahuilu::head[i]) 121 { 122 Oulahuilu::Run(i); 123 break; 124 } 125 if(Oulahuilu::Huilu_cnt!=m) 126 { 127 puts("NO"); 128 } 129 else 130 { 131 puts("YES"); 132 Oulahuilu::Output(); 133 } 134 } 135 else 136 { 137 for(i=1;i<=m;i++) 138 { 139 int x,y; 140 R(x); 141 R(y); 142 Outdeg[x]++; 143 Indeg[y]++; 144 Oulahuilu::add(x,y); 145 } 146 for(i=1;i<=n;i++) if(Indeg[i]!=Outdeg[i]) 147 { 148 return 0*puts("NO"); 149 } 150 for(i=1;i<=n;i++) if(Oulahuilu::head[i]) 151 { 152 Oulahuilu::Run(i); 153 break; 154 } 155 if(Oulahuilu::Huilu_cnt!=m) 156 { 157 puts("NO"); 158 } 159 else 160 { 161 puts("YES"); 162 Oulahuilu::Output(); 163 } 164 } 165 return 0; 166 } 167 /* 168 input 169 1 170 3 3 171 1 2 172 2 3 173 1 3 174 output 175 YES 176 1 2 -3 177 178 input 179 2 180 5 6 181 2 3 182 2 5 183 3 4 184 1 2 185 4 2 186 5 1 187 output 188 YES 189 4 1 3 5 2 6 190 191 input 192 2 193 100000 3 194 41700 41700 195 15415 31090 196 31090 15415 197 output 198 NO 199 */ View Code?
轉載于:https://www.cnblogs.com/gaojunonly1/p/10348777.html
總結
以上是生活随笔為你收集整理的一本通1527欧拉回路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HCL华三模拟器三层交换机DHCP实验
- 下一篇: 艾永亮:打造超级产品做到这五点,有效提高