锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浜屽垎鍥炬渶澶у尮閰嶇殑鍖堢墮鍒╃畻娉曪細 浜屽垎鍥炬槸榪欐牱涓涓浘錛屽畠鐨勯《鐐瑰彲浠ュ垎綾諱袱涓泦鍚圶鍜孻錛屾墍鏈夌殑杈瑰叧鑱斿湪涓や釜欏剁偣涓紝鎭板ソ涓涓睘浜庨泦鍚堬幾錛屽彟涓涓睘浜庨泦鍚堬脊銆?nbsp; 鏈澶у尮閰嶏細 鍥句腑鍖呭惈杈規暟鏈澶氱殑鍖歸厤縐頒負鍥劇殑鏈澶у尮閰嶃?nbsp; 瀹岀編鍖歸厤錛?nbsp;濡傛灉鎵鏈夌偣閮藉湪鍖歸厤杈逛笂錛岀О榪欎釜鏈澶у尮閰嶆槸瀹岀編鍖歸厤銆?nbsp; 鏈灝忚鐩栵細 鏈灝忚鐩栬姹傜敤鏈灝戠殑鐐癸紙錛擱泦鍚堟垨錛歸泦鍚堢殑閮借錛夎姣忔潯杈歸兘鑷沖皯鍜屽叾涓竴涓偣鍏寵仈銆傚彲浠ヨ瘉鏄庯細鏈灝戠殑鐐癸紙鍗寵鐩栨暟錛夛紳鏈澶у尮閰嶆暟 鏈灝忚礬寰勮鐩栵細 鐢ㄥ敖閲忓皯鐨勪笉鐩鎬氦綆鍗曡礬寰勮鐩栨湁鍚戞棤鐜浘錛х殑鎵鏈夌粨鐐廣傝В鍐蟲綾婚棶棰樺彲浠ュ緩绔嬩竴涓簩鍒嗗浘妯″瀷銆傛妸鎵鏈夐《鐐筰鎷嗘垚涓や釜錛氾幾緇撶偣闆嗕腑鐨刬鍜孻緇撶偣闆嗕腑鐨刬',濡傛灉鏈夎竟i->j錛屽垯鍦ㄤ簩鍒嗗浘涓紩鍏ヨ竟i->j'錛岃浜屽垎鍥炬渶澶у尮閰嶄負m,鍒欑粨鏋滃氨鏄痭-m銆? 浜屽垎鍥炬渶澶у尮閰嶇殑緇忓吀鍖堢墮鍒╃畻娉曟槸鐢盓dmonds鍦?965騫存彁鍑虹殑錛?/span>綆楁硶鐨勬牳蹇冨氨鏄牴鎹竴涓垵濮嬪尮閰嶄笉鍋滅殑鎵懼騫胯礬錛岀洿鍒版病鏈夊騫胯礬涓烘銆?/span> 鍖堢墮鍒╃畻娉曠殑鏈川瀹為檯涓婂拰鍩轟簬澧炲箍璺壒鎬х殑鏈澶ф祦綆楁硶榪樻槸鐩鎬技鐨勶紝鍙渶瑕佹敞鎰忎袱鐐癸細 錛堜竴錛夋瘡涓猉鑺傜偣閮芥渶澶氬仛涓嬈″騫胯礬鐨勮搗鐐癸紱 錛堜簩錛夊鏋滀竴涓猋鑺傜偣宸茬粡鍖歸厤浜嗭紝閭d箞澧炲箍璺埌榪欏効鐨勬椂鍊欏敮涓鐨勮礬寰勬槸璧板埌Y鑺傜偣鐨勫尮閰嶇偣錛堝彲浠ュ洖蹇嗘渶澶ф祦綆楁硶涓殑鍚庡悜杈癸紝榪欎釜鏃跺欏悗鍚戣竟鏄彲浠ュ嫻佺殑錛夈?/span> 鎵懼騫胯礬鐨勬椂鍊欐棦鍙互閲囩敤dfs涔熷彲浠ラ噰鐢╞fs錛屼袱鑰呴兘鍙互淇濊瘉O(nm)鐨勫鏉傚害錛屽洜涓烘瘡鎵句竴鏉″騫胯礬鐨勫鏉傚害鏄疧(m)錛岃屾渶澶氬騫縩嬈★紝dfs鍦ㄥ疄闄呭疄鐜頒腑鏇村姞綆鐭?/span> 綆楁硶鎬濇兂錛?nbsp; 綆?娉曠殑鎬濊礬鏄笉鍋滅殑鎵懼騫胯建, 騫跺鍔犲尮閰嶇殑涓暟,澧炲箍杞ㄩ【鍚嶆濅箟鏄寚涓鏉″彲浠ヤ嬌鍖歸厤鏁板彉澶氱殑璺緞,鍦ㄥ尮閰嶉棶棰樹腑,澧炲箍杞ㄧ殑琛ㄧ幇褰㈠紡鏄竴鏉?浜ら敊杞?,涔熷氨 鏄榪欐潯鐢卞浘鐨勮竟緇勬垚鐨勮礬寰? 瀹冪殑絎竴鏉¤竟鏄洰鍓嶈繕娌℃湁鍙備笌鍖歸厤鐨?絎簩鏉¤竟鍙備笌浜嗗尮閰?絎笁鏉¤竟娌℃湁..鏈鍚庝竴鏉¤竟娌℃湁鍙備笌鍖歸厤,騫朵笖濮嬬偣鍜岀粓鐐硅繕娌?鏈夎閫夋嫨榪?榪欐牱浜ら敊榪涜,鏄劇劧 浠栨湁濂囨暟鏉¤竟.閭d箞瀵逛簬榪欐牱涓鏉¤礬寰?鎴戜滑鍙互灝嗙涓鏉¤竟鏀逛負宸插尮閰?絎簩鏉¤竟鏀逛負鏈尮閰?..浠ユ綾繪帹.涔熷氨鏄皢鎵鏈?鐨勮竟榪涜"鍙嶈壊",瀹規槗鍙戠幇榪欐牱淇?nbsp;鏀逛互鍚?鍖歸厤浠嶇劧鏄悎娉曠殑,浣嗘槸鍖歸厤鏁板鍔犱簡涓瀵?鍙﹀,鍗曠嫭鐨勪竴鏉¤繛鎺ヤ袱涓湭鍖歸厤鐐圭殑杈規樉鐒朵篃鏄氦閿欒建.鍙互璇佹槑, 褰撲笉鑳藉啀鎵懼埌澧炲箍杞ㄦ椂,灝卞緱鍒頒簡涓涓?nbsp;鏈澶у尮閰?榪欎篃灝辨槸鍖堢墮鍒╃畻娉曠殑鎬濊礬.銆?/span>
鎬濊礬錛歍arjan緙╃偣鍚庯紝鍏呰鏉′歡鏄紝鎴愪竴鏉¢摼銆傛嫇鎵戞帓搴忔眰鍒ゆ柇涔嬨?br />
#include<string.h>
#include<math.h>
#define maxn 1010
#define maxm 60600
struct edge{
int v;
int next;
}edges[maxm];
int last[maxn];
int edge_cnt;
void add_edge(int u,int v)
{
edges[edge_cnt].v = v;
edges[edge_cnt].next = last[u];
last[u] = edge_cnt++;
return ;
}
int dfn[maxn],low[maxn];
int color[maxn];
bool instack[maxn];
int st[maxn],top;
int cnt,scnt;
int n,m;
int N;
int mat[maxn][maxn];
int topo[maxn];
int dg[maxn];
int path[maxn];
int min(int x,int y)
{
return x<y?x:y;
}
void tarjan(int u)
{
dfn[u]=low[u]=cnt++;
st[++top]=u;
instack[u]=1;
for (int j=last[u];j!=-1;j=edges[j].next)
{
int v = edges[j].v;
if (dfn[v]==-1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (instack[v])
low[u]=min(low[u],low[v]);
}
if (low[u]==dfn[u])
{
scnt++;
int x;
do
{
x=st[top--];
instack[x]=0;
color[x]=scnt;
}while (x!=u);
}
return ;
}
void solve()
{
cnt = 0;
scnt = 0;
top = 0;
memset(dfn,-1,sizeof(dfn)); //鍒濆榪欓噷灞呯劧閿欎簡銆?br /> memset(instack,0,sizeof(instack));
for (int i=1;i<=n;i++)
if (dfn[i]==-1)
tarjan(i);
return ;
}
void init()
{
memset(last,-1,sizeof(last));
edge_cnt = 0;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v);
}
return ;
}
void work()
{
solve();
N = scnt;//姹傚嚭鐨勫己榪為氭暟
memset(mat,0,sizeof(mat));
for (int i=1;i<=n;i++)
{
for (int j=last[i];j!=-1;j=edges[j].next)
{
int v = edges[j].v;
mat[color[i]][color[v]]=1;
}
}
return ;
}
bool topsort()
{
memset(dg,0,sizeof(dg));
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
if (i!=j)//娉ㄦ剰鑷繁鍒拌嚜宸變笉鍙傚綋鏄氨鍦ㄨ繖閲學A浜嗭紒
dg[i] += mat[j][i];
for (int k=1;k<=N;k++)
{
int i=1;
while (dg[i]>0 && i<=n) i++;
if (i>n)
return 0;
dg[i]=-1;
for (int j=1;j<=N;j++)
dg[j]-=mat[i][j];
path[k]=i;
}
return 1;
}
int main()
{
int cas;
scanf("%d",&cas);
while (cas--)
{
init();
work();
bool flag = 1;
topsort();
for (int i=1;i<N;i++)
{
if (!mat[path[i]][path[i+1]])
{
flag = 0;
break;
}
}
if (flag)
puts("Yes");
else
puts("No");
}
return 0;
}
/*
3 3
1 2
2 3
3 1
8 11
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
6 8
7 6
*/
]]>
{
int v;
int next;
} edges[maxn*maxn];
int last[maxn];
int tot;
void add(int u,int v)
{
edges[tot].v = v;
edges[tot].next = last[u];
last[u] = tot++;
return ;
}
int st[maxn],top; //妯℃嫙鏍?br />int cnt,scnt; //鏃墮棿鍜岃繛閫氬垎閲忚鏁?br />
Tarjan綆楁硶閮ㄥ垎錛?br />
{
int x;
dfn[u]=low[u]=cnt++;
st[++top]=u;
instack[u]=1;
for (int j=last[u];j!=-1;j=edges[j].next)
{
int v = edges[j].v;
if (dfn[v]==-1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v]) low[u]=min(low[u],dfn[v]);
}
if (dfn[u]==low[u]) //浠涓烘牴鑺傜偣鐨勬爲褰㈡垚涓涓繛閫氬垎閲?br /> {
do
{
x=st[top--];
instack[x]=0;
color[x]=scnt;
}
while (x!=u);
scnt++;
}
return ;
}
solv()鍑芥暟閮ㄥ垎錛?br />
{
cnt=0;
scnt=0;
top=0;
memset(dfn,-1,sizeof(dfn));
memset(instack,0,sizeof(instack));
for(int i=0; i<n*2; i++)
if (dfn[i]==-1)
{
tarjan(i);
}
return ;
}
2—SAT涓垽鏂槸鍚﹀艦鎴愯嚜鐜痗heck()
{
for (int i=0; i<n; i++)
if (color[i]==color[i+n])
return 0;
return 1;
}
姹傚嚭榪為氬垎閲忕殑瑙c傚緟瀹氥?img src ="http://www.shnenglu.com/ArcTan/aggbug/193361.html" width = "1" height = "1" />
]]>
2銆丮enger瀹氱悊錛氭棤鍚戝浘G鐨勯《鐐硅繛閫氬害
k(G)=V|G|-1 G鏄畬鍏ㄥ浘錛宮in <A,B>! in E錛圥錛圓錛孊錛夛級else
3銆佺敤鏈澶ф祦娉曟眰P錛圓錛孊錛夈?br /> 4銆佸緩鍥撅細e=(u,v)鍒嗘垚e'=(u'',v')鍜宔''=(u',v'');e'=e''=inf銆?br />
寰楀ソ濂界爺絀剁爺絀惰繖浜涘浘璁虹殑鍘熺悊錛屾悶鏄庣櫧銆傘婂浘璁恒嬭繖鏈功錛岃寰椾笉琛屽晩錛侊紒錛侊紒榪樻槸寰楀ソ濂藉涔犮婄畻娉曞璁恒?br />
鏈澶ф祦錛屽ソ瑕佸ソ濂藉錛?br />
#include<string.h>
#include<math.h>
#include<algorithm>
#define maxn 105
#define inf 105
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
using namespace std;
int map[maxn][maxn];
int N,M;
int max_flow(int num,int map[][maxn],int source,int sink)
{
int que[maxn],head,tail;
int pre[maxn],min_flow[maxn];
int flow[maxn][maxn];
int ans=0;
memset(flow,0,sizeof(flow));
while (1)
{
head=0;tail=1;
que[1]=source;
memset(pre,-1,sizeof(pre));
min_flow[source]=inf;
pre[source]=-2;
while (head<tail)
{
int temp=que[++head];
for (int i=0;i<num;i++)
{
if (pre[i]==-1 && flow[temp][i]<map[temp][i])
{
que[++tail]=i;
pre[i]=temp;
min_flow[i]=min(min_flow[temp],(map[temp][i]-flow[temp][i]));
}
}
if (pre[sink]!=-1)
{
int k=sink;
while (pre[k]>=0)
{
flow[pre[k]][k]+=min_flow[sink];
flow[k][pre[k]]=-flow[pre[k]][k];
k=pre[k];
}
break;
}
}
if (pre[sink]==-1)
return ans;
else
ans+=min_flow[sink];
}
}
int main()
{
while (scanf("%d%d",&N,&M)==2)
{
int u,v,ans;
int i;
memset(map,0,sizeof(map));
for (i=0;i<N;i++)
map[i][i+N]=1;
for (i=0;i<M;i++)
{
scanf(" (%d,%d)",&u,&v);
map[u+N][v]=map[v+N][u]=inf;
}
ans=inf;
for (i=1;i<N;i++)
{
ans=min(ans,max_flow(N*2,map,0+N,i)); //榪欓噷娌℃湁鎼炴槑鐧芥庝箞鏄?lt;N , i>鍛紵錛燂紵
}
if (ans==inf)
ans=N;
printf("%d\n",ans);
}
return 0;
}
鍥捐銆?br />
]]>
]]>
鍙浘鐨勶紙Graphic錛夛細涓涓潪璐熸暣鏁扮粍鎴愮殑鏈夐檺搴忓垪濡傛灉鏄煇涓棤鍚戝浘鐨勫害搴忓垪錛屽垯縐拌搴忓垪鏄疓raphic錛?br />
Havel-Hakimi瀹氱悊錛堣椽蹇冿級錛?br /> 鐢遍潪璐熸暟緇勬垚鐨勯潪澧炲簭鍒梥:d1,d2,d3....dn錛坣>=2,d1>=1錛夋槸Graphic錛屽綋涓斾粎褰撳簭鍒?br /> s1:d2-1,d3-1,...,d(d1+1)-1,d(d1+2),....,dn 鏄疓raphic錛?br />
搴旂敤錛歱oj1659錛?br />
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct vertex
{
int deg;
int index;
} ver[12];
int adj[12][12];
int n;
int cmp(vertex v1,vertex v2)
{
return v1.deg>v2.deg;
}
int Havel_Hak()
{
int i,j,u,v,m;
i=1;
while (i<n)
{
sort(ver+i,ver+n+1,cmp);
m=ver[i].deg;
u=ver[i].index;
if (i+m>n)
return 0;
j=i+1;
while (j<=i+m)
{
ver[j].deg--;
if (ver[j].deg<0)
return 0;
v=ver[j].index;
adj[u][v]=adj[v][u]=1;
j++;
}
i++;
}
return 1;
}
int print(int flag)
{
int i,j;
if (!flag)
{
printf("NO\n");
return 0;
}
printf("YES\n");
for (i=1;i<=n;i++)
{
for (j=1;j<n;j++)
printf("%d ",adj[i][j]);
printf("%d\n",adj[i][j]);
}
return 0;
}
int main()
{
int t,i;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&ver[i].deg);
ver[i].index=i;
}
memset(adj,0,sizeof(adj));
print(Havel_Hak());
if (t>0)
printf("\n");
}
return 0;
}
]]>
C閭繪帴鐭╅樀錛?br />
#include<string.h>
#include<math.h>
int result[105];
int state[105];
int data[105][105];
int n1,n2,m,ans;
int init()
{
int i,x,y;
memset(result,0,sizeof(result));
memset(data,0,sizeof(data));
scanf("%d%d%d",&n1,&n2,&m);
for (i=0;i<m ;i++ )
{
scanf("%d%d",&x,&y);
data[x][y]=1;
}
return 0;
}
int find(int x)
{
int i;
for (i=1;i<=n2 ;i++ )
{
if (data[x][i]==1 && !state[i])
{
state[i]=1;
if (result[i]==0 || find(result[i]))
{
result[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i;
init();
ans=0;
for (i=1;i<=n1 ;i++ )
{
memset(state,0,sizeof(state));
if (find(i))
ans++;
}
printf("%d\n",ans);
return 0;
}
POJ_1274:![]()
]]>