青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

M.J的blog

algorithm,ACM-ICPC
隨筆 - 39, 文章 - 11, 評論 - 20, 引用 - 0
數(shù)據(jù)加載中……

TOJ 3446.Money Matters 并查集,路徑壓縮

        題目大意是N個人互相有債a[i](正的表示別人欠錢,否則表示自己欠別人錢,a[i]的和保證為0),但是這N個人只有朋友間才能互相算帳,現(xiàn)在給出N個人的債,并且給出M個關系,即誰和誰是朋友,最后問有沒有可能所有人都把帳算清。


Sample Input 1:                         Sample Input 2:

5    3                                            4     2
100                                              15
-75                                               20
-25                                              -10
-42                                              -15
42                                                0  2
0 1                                               1  3
1 2
3 4

Sample Output 1:                       Sample Output  2:

POSSIBLE                                    IMPOSSILBE

 思路1:

              每輸入一個關系,合并,最后從1到N,對于每一個人,找出它們的祖先,將他們的債debt加到祖先的debt

              上。通俗的講,就是每個集合的成員都將自己的debt加到祖先上,自己歸0,最后看祖先的值是否為0;

              最后在從1到N掃一遍如果有debt不為0的,輸出“IMPOSSIBLE”,否則“POSSIBLE”;

              缺點:復雜度高,查詢復雜度*N,最后勉強過了,時間0.63s

思路2:

              路徑壓縮,每輸入一個關系,合并。最后從1到N,如果 i 的debt不為0,從 i 到 i 的祖先的路徑不斷壓縮直到

              祖先,這樣雖然仍然是N次操作,但由于在壓縮過程中大部分成員debt歸0,故實際上進行操作的次數(shù)遠小于N.

              最后時間為0.11,比起上一種方法有了很大提高

Code 1:

#include <cstdio>
#include 
<cstring>
struct Node{
        
int father,v,num;
}a[
10002];
int find(int n){
        
int tep,m = n;
        
while(n != a[n].father)
                n 
= a[n].father;
        
while(m != n){
                tep 
= a[n].father;
                a[n].father 
= n;
                m 
= tep;
        }
        
return n;
}
void Union(int root1,int root2){
        
int t1,t2;
        t1 
= find(root1),t2 = find(root2);
        
if(t1 == t2) return ;
        
else{
                
if(a[t1].v > a[t2].v){
                        a[t1].v 
+= a[t2].v;
                        a[t2].father 
= t1;
                }
                
else{
                        a[t2].v 
+= a[t1].v;
                        a[t1].father 
= t2;
                }
        }
}
int main()
{
        
int n,m,i,j;
        
bool flag = false;
        scanf(
"%d%d",&n,&m);
        
for(i = 0;i < n; ++i){
                a[i].father 
= i,a[i].v = 0;
                scanf(
"%d",&a[i].num);
        }
        
while(m--){
                scanf(
"%d%d",&i,&j);
                Union(i,j);
        }
        
for(i = 0;i < n; ++i){
                
int tep = find(i);
                
int tt = a[i].num;
                a[i].num 
-= tt;
                a[tep].num 
+= tt;
        }
        
for(i = 0;i < n; i++)
                
if(a[i].num != 0){
                        flag 
= true;
                        
break;
                }
        
if(flag) printf("IMPOSSIBLE\n");
        
else     printf("POSSIBLE\n");
}

Code 2:

#include <cstdio>
#include 
<cstring>
struct Node{
        
int father,v,num;
}a[
10002];
int find(int n){
        
int m = n,tep;
        
while(n != a[n].father)
                n 
= a[n].father;
        
while(m != n){
                tep 
= a[m].father;
                
int tt = a[m].num;
                a[m].num 
-= tt;
                a[tep].num 
+= tt;
                a[m].father 
= n;
                m 
= tep;
        }
        
return n;
}
void Union(int root1,int root2){
        
int t1,t2;
        t1 
= find(root1),t2 = find(root2);
        
if(t1 == t2) return ;
        
else{
                
if(a[t1].v > a[t2].v){
                        a[t1].v 
+= a[t2].v;
                        a[t2].father 
= t1;
                }
                
else{
                        a[t2].v 
+= a[t1].v;
                        a[t1].father 
= t2;
                }
        }
}
int main()
{
        
int n,m,i,j;
        
bool flag = false;
        scanf(
"%d%d",&n,&m);
        
for(i = 0;i < n; ++i){
                a[i].father 
= i,a[i].v = 0;
                scanf(
"%d",&a[i].num);
        }
        
while(m--){
                scanf(
"%d%d",&i,&j);
                Union(i,j);
        }
        
for(i = 0;i < n; ++i)
             
if(a[i].num != 0) find(i);
        
for(i = 0;i < n; i++)
                
if(a[i].num != 0){
                        flag 
= true;
                        
break;
                }
        
if(flag) printf("IMPOSSIBLE\n");
        
else     printf("POSSIBLE\n");
}








posted on 2010-07-05 21:08 M.J 閱讀(334) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久夜色精品国产噜噜av| 久久综合国产精品台湾中文娱乐网 | 亚洲淫片在线视频| 国产精品久久久久久亚洲毛片| 中文亚洲欧美| 亚洲小说区图片区| 国产亚洲精品自拍| 老色鬼久久亚洲一区二区| 久久一区二区三区国产精品 | 欧美视频网址| 欧美一区二区黄色| 久久久久国产一区二区三区| 亚洲精品国产精品乱码不99按摩 | 亚洲影视综合| 狠狠色综合色区| 亚洲高清久久久| 欧美体内谢she精2性欧美| 久久成人综合网| 久久最新视频| 亚洲小说欧美另类社区| 欧美一级免费视频| 亚洲激情中文1区| 中文精品视频一区二区在线观看| 国产伦精品一区二区三区高清版| 久热精品在线| 欧美性大战久久久久久久| 久久久免费av| 欧美日韩专区在线| 久久精品中文| 欧美日韩www| 久热精品视频| 国产精品热久久久久夜色精品三区| 久久久久久精| 欧美日韩一区二区三区在线看| 久久狠狠婷婷| 欧美日韩一区二区三区在线视频| 久久九九免费视频| 国产精品福利片| 欧美高清在线| 国产精品一级| 91久久精品久久国产性色也91| 国产丝袜一区二区| 亚洲精品一区中文| 狠狠色香婷婷久久亚洲精品| 亚洲制服丝袜在线| 中国女人久久久| 欧美成人精品在线播放| 蜜臀av性久久久久蜜臀aⅴ| 国产精品每日更新| 日韩一二三区视频| 亚洲人成在线播放| 蜜桃av一区二区三区| 久久精品在线| 国产一区二区三区四区老人| 亚洲在线一区| 亚洲一区二区日本| 欧美日韩免费高清| 亚洲人在线视频| 在线成人激情视频| 久久久久成人网| 久久久久久综合网天天| 国产人成精品一区二区三| 亚洲综合国产激情另类一区| 亚洲一区二区免费视频| 欧美三级视频在线播放| 日韩视频免费在线| 亚洲天堂av在线免费| 欧美日韩国产免费| 一区二区三欧美| 性欧美1819性猛交| 国产精品视频专区| 新67194成人永久网站| 久久激情一区| 国产一区二区中文字幕免费看| 亚洲男人天堂2024| 久久中文字幕一区二区三区| 韩国女主播一区二区三区| 久久成人免费| 欧美国产成人精品| 日韩亚洲欧美精品| 欧美午夜剧场| 欧美一区视频| 欧美1区免费| 亚洲精品色图| 国产精品国产三级国产aⅴ9色| 亚洲午夜av在线| 久久在线视频在线| 99视频精品免费观看| 国产精品国色综合久久| 欧美制服丝袜| 欧美黄色小视频| 亚洲一二三区在线| 国产无一区二区| 免费黄网站欧美| 99精品欧美一区二区蜜桃免费| 亚洲欧美激情四射在线日 | 欧美中文字幕在线播放| 伊人久久大香线蕉av超碰演员| 欧美99久久| 亚洲欧美成人一区二区三区| 免费在线亚洲| 亚洲淫性视频| 亚洲成人自拍视频| 国产精品欧美久久| 久久在线观看视频| 亚洲无人区一区| 免费永久网站黄欧美| 亚洲一区二区三区涩| 在线观看欧美精品| 国产精品久久久久久久久久久久久久| 久久精品国产99国产精品| 亚洲精选在线观看| 蜜桃久久av| 性欧美大战久久久久久久久| 亚洲国产精品一区二区第四页av| 国产精品男女猛烈高潮激情| 欧美69视频| 欧美在线免费观看| 亚洲天堂av电影| 91久久中文| 欧美成年人视频网站| 先锋影音网一区二区| 一区二区三区四区五区精品视频 | 欧美激情中文字幕在线| 久久超碰97人人做人人爱| 一本色道婷婷久久欧美| 亚洲欧洲日韩在线| 欧美91大片| 老**午夜毛片一区二区三区| 欧美一区二区精品在线| 一区二区冒白浆视频| 91久久久亚洲精品| 亚洲国产高清一区| 狠狠入ady亚洲精品经典电影| 国产精品日本欧美一区二区三区| 欧美国产综合| 欧美大片va欧美在线播放| 美女任你摸久久| 麻豆精品在线播放| 久久综合99re88久久爱| 久久精品一区四区| 久久精品国语| 久久精品在线免费观看| 久久精品国产一区二区三| 亚洲女同同性videoxma| 午夜精品美女自拍福到在线| 亚洲一区二区三区久久| 亚洲一区二区精品视频| 亚洲天堂av高清| 午夜精品久久| 欧美一区久久| 美女露胸一区二区三区| 欧美成人自拍视频| 欧美日韩中文字幕精品| 国产精品久久999| 国产精品自拍小视频| 国产在线拍偷自揄拍精品| 影音先锋欧美精品| 亚洲精品国产精品国自产观看 | 国产日产精品一区二区三区四区的观看方式 | 亚洲国产精品第一区二区三区| 欧美大片免费| 亚洲精品欧美在线| 一二三区精品福利视频| 午夜国产一区| 久久中文在线| 欧美日韩三级| 国产婷婷色一区二区三区在线| 国内成+人亚洲| 亚洲欧洲一区二区三区在线观看| 一区二区欧美激情| 香蕉国产精品偷在线观看不卡| 久久免费国产精品| 亚洲丰满少妇videoshd| 夜夜嗨av一区二区三区中文字幕| 亚洲欧美日韩爽爽影院| 久久亚洲影院| 国产精品二区二区三区| 一区二区在线看| 中日韩视频在线观看| 久久蜜桃香蕉精品一区二区三区| 欧美高清视频一区二区三区在线观看| 99视频一区| 免费日本视频一区| 国产精品色在线| 亚洲麻豆一区| 久久久久久夜| 在线视频你懂得一区二区三区| 欧美综合激情网| 国产精品国码视频| 亚洲国产一区二区精品专区| 午夜激情一区| 亚洲狠狠丁香婷婷综合久久久| 欧美一级在线播放| 欧美日韩亚洲高清一区二区| 在线观看91精品国产入口| 欧美一区二区三区四区视频| 最新中文字幕一区二区三区| 久久久亚洲高清| 国产欧美午夜|